首页 > 编程知识 正文

二叉树的叶子节点计算,根节点到叶子节点路径

时间:2023-05-05 08:30:31 阅读:160333 作者:4509

这是典型的面试问题。 我在网上查了很多代码,感觉有一部分写得不严密。 今天做总结。

想法:

1 .递归回溯

2 .非递归后的遍历(单栈版),只要在每次遇到叶的节点时输出栈内的要素即可。

以下代码都基于构想1的代码。

请参阅版本1:vectorvoidleavespath (treenode * root,vectorint path )//vectorif ) root==null ) return ); path.push_back(root-val; 根左==空根右==空) for(intI=0; i path.size (; I ) { cout path[i] '; } cout endl; }else{leavespath(root-left,path ); leavespath(root-right,path ); } path.pop_back (; //键}测试程序

vectorint path; lavespath(N0,path ); //n0是自己建造的树的根节点的版本2 :数组长voidleavespath2(treenode*root,int* path,int len ) if ) root==null ) return; path[len ]=root-val; 根左==空根右==空) for(intI=0; i len; I ) { cout path[i] '; } cout endl; }else{leavespath2(root-left,path,len ); leaves path2(根权限,path,len ); }测试程序

int path2[20]={ 0 }; lavespath2(N0,path 2,0 ); //n0参照自己建造的树的根节点的版本3 () )数组参照长voidleavespath3(treenode*root,int* path,int len ) ) int* path置换为int* path 根左==空根右==空) for(intI=0; i len; I ) { cout path[i] '; } cout endl; }else{leavespath3(root-left,path,len ); leaves path3(根权限,path,len ); (} --len; //此过程与版本1中的pop_back的目的相同。 }测试程序

int path2[20]={ 0 }; int len=0; int *path3=path2; leavespath3(N0,path3,len ); //n0是自己构建的树的根节点的结束语:通过识别三个版本的差异,在把握递归本质的同时,感受引用的作用。 如果能试着把版本变成非递归的形式的话,那边还会提高。

我个人推荐版本1。 我不知道你是怎么想的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。