二元树求某一值路径。

来源:互联网 发布:想给淘宝店铺取个名字 编辑:程序博客网 时间:2024/06/05 00:38

描述: 

请写一个程序创建一棵二元树,并按照一定规则,输出二元树根节点到叶子节点的路径。规则如下:
从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设置的某一值的相同,那么输出这条路径上的所有节点。从根节点遍历树时,请请按照左到右遍历,即优先访问左子树的节点。


比如下面一些转化的例子:

输入"10,5,12,4,7"值,构造的树如下(注意:构造二元树时,需要从上到下一层一层的,按照从左到右的顺序进行构造)

1)    10


2)    10
       /
      5
      
3)    10
       /\
      5  12
 
4)    10
       /\
      5  12 
     /
    4     
      
5)    10
       /\
      5  12 
     /\
    4  7

如果当前我们设置的“路径和”为19,那么输出结果为:"10,5,4$",如果当前我们设置的值为22,那么输出结果为:"10,5,7$10,12$",$字符表

示结尾。如果没有找到路径和为设置的值的路径,输出'\0',即无显示

 

 知识点: 题目来源: 内部整理 练习阶段: 中级 运行时间限制:无限制内存限制:无限制输入: 

输入路径和

输入树各节点值

 输出: 

满足条件的路径上的所有节点

 样例输入:
1910,5,12,4,7                   
样例输出:
10,5,4$                    

使用数组,可以简单的解决这个问题,但是错误出现在没有从左子树遍历,即dfs,改进,直接从左往又,获得其叶子节点,首先获得最左端的叶子节点,使用a * 2 + 1,获得最外层,节点,然后获得第二节点,处理得到第二层最左端叶子节点,由此一次计算得到由左向右遍历的结果。 




void main(){int tree[1001];for(int i = 0 ; i < 1001; i ++)tree[i] = 0 ;int values, site;//cout<< -1/2; w为0 。cin>>values;string str,buff;cin>>str;int num = 0;while(true){site  = str.find(",");if(site == str.npos)break;buff = str.substr(0,site);tree[num++] = atoi( buff.c_str());str = str.substr(site + 1);}tree[num++] = atoi( str.c_str());//此应该为完全二叉树int ends =  0;int starts = 0;int path = 0;string outputs[100];int outends[100];int outNum = 0;string output;while(ends < num){if(ends * 2 + 1  >= num ){//为根节点starts = ends;path = tree[starts];output = myToString( tree[starts] );while(starts > 0){starts = (starts - 1 ) / 2;path += tree[starts];output = myToString( tree[starts] ) +',' + output;}output += "$";if(path == values){outputs[outNum] = output;outends[outNum++] = ends; }}ends ++;}if(outNum == 0 )cout<<'\0'<<endl;else{int lefts = 0;while((lefts*2 +1) <= num){lefts = lefts*2+1;}for(int j = 0; j < outNum;j++)if( outends[j] > lefts)cout<<outputs[j];for(int j = 0; j < outNum;j++)if( outends[j] < lefts)cout<<outputs[j];cout<<endl;}}




0 0