您的位置:首页 > 其它

4.在二元树中找出和为某一值的所有路径

2011-07-12 12:18 369 查看
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如输入整数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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: