这是典型的面试问题。 我在网上查了很多代码,感觉有一部分写得不严密。 今天做总结。
想法:
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。 我不知道你是怎么想的。