热门教程推荐
  • 【一】数据结构与算法
    【一】数据结构与算法
    数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素集合。它包含三方面的内容,逻辑关系、存储关系及操作。
  • 【三】Java流程控制语句
    【三】Java流程控制语句
    从结构化程序设计角度出发,程序有3种结构:顺序结构、选择结构和循环结构。若是在程序中没有给出特别的执行目标,系统则默认自上而下一行一行地执行该程序,这类程序的结构就称为顺序结构。
  • 【一】算法是什么
    【一】算法是什么
    提到“算法”,很多人都觉得它高深莫测、晦涩难懂。事实上的确存在一些算法,学员必须具备优秀的数学基础和编程能力才能驾驭。
  • 【二十一】创建之单例设计模式
    【二十一】创建之单例设计模式
    单例模式是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
  • 【九】部分背包问题
    【九】部分背包问题
    背包问题是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。
  • 【二】Unity3D视图界面
    【二】Unity3D视图界面
    Unity3D视图界面Unity3D视图界面Unity3D视图界面Unity3D视图界面Unity3D视图界面Unity3D视图界面Unity3D视图界面Unity3D视图界面
  • 【九】Unity3D游戏发布
    【九】Unity3D游戏发布
    Unity3D游戏发布Unity3D游戏发布Unity3D游戏发布Unity3D游戏发布Unity3D游戏发布Unity3D游戏发布Unity3D游戏发布Unity3D游戏发布
  • 【十】表查找解
    【十】表查找解
    查找表又可分为静态查找表和动态查找表。借助静态查找表可引申出顺序查找算法、折半查找算法、分块查找算法等;而记住动态查找表,也可以通过构建二叉排序树、平衡二叉树等实现查找操作。

【游戏算法】在二元树中找出和为某一值的所有路径

8352

输入一个整数和一棵二元树,从树的根结点开始往下访问,一直到叶结点所经过的所有结点形成一条路径,打印出和与输入整数相等的所有路径。例如,输入整数 9 和如下二元树:

在二元树中找出和为某一值的所有路径_游戏算法-游民部落(gamecolg.com)

则打印出两条路径:3,6 和 3,2,4

【答案】

typedef struct path 
{ 
     BiTNode* tree;  	        //结点数据成员 
     struct path* next;  	 
}PATH,*pPath; 	 	 	 	//结点指针成员 

//初始化树的结点栈: 
void init_path( pPath* L ) 
{ 
     *L = ( pPath )malloc( sizeof( PATH ) ); 
     ( *L )->next = NULL;  
} //创建空树 

//树结点入栈函数: 
void push_path(pPath H, pBTree T) 
{ 
     pPath p = H->next; 
     pPath q = H; 
     while( NULL != p ) 
     { 
 	q = p; 
 	p = p->next; 
    } 
    p = ( pPath )malloc( sizeof( PATH ) ); //申请新结点 
    p->next = NULL; 	 	 	 //初始化新结点 
} 

p->tree = T;  
q->next = p;  	 	 	 	 //新结点入栈 

//树结点打印函数: 
void print_path( pPath L ) 
{ 
     pPath p = L->next;  
 
     while( NULL != p ) 	 	 	 
     { 
          printf("%d, ", p->tree->data);   
          p = p->next;  
     }  
} //打印当前栈中所有数据 

///树结点出栈函数: 
void pop_path( pPath H ) 
{
	pPath p = H->next; 
	pPath q = H; 
	if( NULL == p )  	 	    //检验当前栈是否为空 
 	{ 
 	    printf("Stack is null!\n"); 
 	    return; 
	} 
	p = p->next; 
	while( NULL != p ) 	 	     //出栈 
	{ 
 	    q = q->next;  	
 	    p = p->next; 
	} 
	free( q->next );  	 	    //释放出栈结点空间 
	q->next = NULL;  
}			

//判断结点是否为叶子结点: 
int IsLeaf(pBTree T) 
{ 
     return ( T->lchild == NULL )&&( T->rchild==NULL );  
} 

//查找符合条件的路径: 
int find_path(pBTree T, int sum, pPath L) 
{ 
 	push_path( L, T); record += T->data;  
 	if((record == sum ) && (IsLeaf(T)))     //打印符合条件的当前路径 
	{ 
 	    print_path( L );  
 	    printf( "\n" );  
	} 
	if( T->lchild != NULL ) 	 	     //递归查找当前节点的左孩子 
	{ 
 	    find_path( T->lchild, sum, L); 
	} 
	if( T->rchild != NULL )  	 	     //递归查找当前节点的右孩子 
	{ 
 	    find_path( T->rchild, sum, L); 
	} 
	record -= T->data;  pop_path(L);  return 0; 	
}


注意:数据结构一定要活学活用,例如本题,把所有的结点都压入栈,而不符合条件的结点弹出栈,很容易实现了有效路径的查找。虽然用链表也可以实现,但是用栈更利于理解这个问题,即适当的数据结构为更好的算法设计提供了有利的条件。


特别声明:本文仅供交流学习 , 版权归属原作者,并不代表游民部落赞同其观点和对其真实性负责。若文章无意侵犯到您的知识产权,损害了您的利益,烦请与我们联系vmaya_gz@126.com,我们将在24小时内进行修改或删除。

相关推荐:

精品教程推荐
  • 【五】Java数字和日期处理:Java数字处理和日期类
    【五】Java数字和日期处理:Java数字处理和日期类
    Java提供了处理相关问题的类,包括Math类、Random类、BigInteger类、Date类等。本章将会详细介绍这些与数学和日期处理相关的类。
  • 【二】游戏世界之渲染窗口
    【二】游戏世界之渲染窗口
    游戏世界之渲染窗口
  • 【九】动态内存管理
    【九】动态内存管理
    动态内存管理机制,主要包含两方面内容,用户申请内存空间时,系统如何分配;用户使用内存空间完成后,系统如何及时回收。
  • 【四】3D美术资源规范
    【四】3D美术资源规范
    美术3D资源规范美术3D资源规范美术3D资源规范美术3D资源规范美术3D资源规范
  • 【三十】游戏UI之列表和无线列表
    【三十】游戏UI之列表和无线列表
    游戏UI界面之列表和无线列表游戏UI界面之列表和无线列表游戏UI界面之列表和无线列表游戏UI界面之列表和无线列表游戏UI界面之列表和无线列表游戏UI界面之列表和无线列表游戏UI界面之列表和无线列表游戏UI界面之列表和无线列表游戏UI界面之列表和无线列表
  • 【二十】排序之快速排序算法
    【二十】排序之快速排序算法
    提到排序算法,多数人最先想到的就是快速排序算法。快速排序算法是在分治算法基础上设计出来的一种排序算法,和其它排序算法相比,快速排序算法具有效率高、耗费资源少、容易实现等优点。
  • 【一】Lua学习入门
    【一】Lua学习入门
    Lua有一个同时进行的JIT项目,提供在特定平台上的即时编译功能,Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。
  • 【二】项目工程结构规划
    【二】项目工程结构规划
    项目工程结构规划项目工程结构规划项目工程结构规划项目工程结构规划