4.在二元树中找出和为某一值的所有路径
来源:互联网 发布:推荐一本学java 编辑:程序博客网 时间:2024/06/05 14:39
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如输入整数22和如下二元树
10
/ \
5 12
/ \
4 7
则打印出两条路径:10, 12和10, 5, 7。
分析:考查对树这种基本数据结构以及递归函数的理解。
当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,
则当前的路径符合要求,我们把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回到父结点。
因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是根结点到父结点的路径。
我们不难看出保存路径的数据结构实际上是一个栈结构,因为路径要与递归调用状态一致,而递归调用本质就是一个压栈和出栈的过程。
#include<iostream>#include<vector>using namespace std;struct BinaryTreeNode{int m_value;BinaryTreeNode *m_pleft;BinaryTreeNode *m_pright;};void creatBinaryTree(BinaryTreeNode * &r,int m){if(r==NULL){BinaryTreeNode *t=new BinaryTreeNode();t->m_pleft=NULL;t->m_pright=NULL;t->m_value=m;r=t;}if(m < r->m_value)creatBinaryTree(r->m_pleft,m);if(m > r->m_value)creatBinaryTree(r->m_pright,m);//if(m == r->m_value)//cout<<"加入重复结点!"<<endl;}void FindPath(BinaryTreeNode *cur,int expectedvalue,int curvalue,vector<int> &path){if(cur==NULL)return;if(cur->m_value>expectedvalue)return;curvalue+=cur->m_value;path.push_back(cur->m_value);bool isleaf=(!cur->m_pleft&&!cur->m_pright);if(curvalue==expectedvalue&&isleaf){vector<int>::iterator iter=path.begin();for(;iter!=path.end();iter++)cout<<*iter<<" ";cout<<endl;}if(cur->m_pleft)FindPath(cur->m_pleft,expectedvalue,curvalue,path);if(cur->m_pright)FindPath(cur->m_pright,expectedvalue,curvalue,path);curvalue-=cur->m_value;path.pop_back();}int main(){BinaryTreeNode *r=NULL;int value=22;vector<int> vec;creatBinaryTree(r,10);creatBinaryTree(r,5);creatBinaryTree(r,12);creatBinaryTree(r,4);creatBinaryTree(r,3);creatBinaryTree(r,7);FindPath(r,22,0,vec);return 0;}
- 4.在二元树中找出和为某一值的所有路径(树)
- 4.在二元树中找出和为某一值的所有路径(树)
- 4.在二元树中找出和为某一值的所有路径(树)
- 4.在二元树中找出和为某一值的所有路径(树)
- 4.在二元树中找出和为某一值的所有路径
- 4.在二元树中找出和为某一值的所有路径
- 面试100题:4.在二元树中找出和为某一值的所有路径
- 4.在二元树中找出和为某一值的所有路径
- 面试100题:4.在二元树中找出和为某一值的所有路径
- 4.在二元树中找出和为某一值的所有路径
- 在二元树中找出和为某一值的所有路径的个人代码
- 在二元树中找出和为某一值的所有路径(树)
- 在二元树中找出和为某一值的所有路径(树)
- No4、在二元树中找出和为某一值的所有路径(树)
- 在二元树中找出和为某一值的所有路径(树)
- 在二元树中找出和为某一值的所有路径(树)
- 在二元树中找出和为某一值的所有路径-递归算法
- 在二元树中找出和为某一值的所有路径
- poj3715——Blue and Red//最小顶点覆盖
- JUnit 和 Ant
- 如果有一天你没有了动力,可以看看
- linux串口通信中设置软件控制输入流的开始和结束
- Xcode4.2 b2下Foundation项目的编译错误的解决方法
- 4.在二元树中找出和为某一值的所有路径
- Member Function Pointers and the Fastest Possible C++ Delegates - 成员函数指针与高性能的C++委托
- JTable是Swing编程中很常用的控件,这里总结了一些常用方法以备查阅.
- 柯达Z1275的AA电池问题
- 位运算
- (C#)Singleton design pattern sample
- 基于Android的Word文档阅读器
- Android FrameWork——Activity启动过程详解
- JAVA 动态代理