问题描述:给定一颗二叉树,求其中和为某一特定值得所有路径。路径定义为根到叶子的所有节点。
主要思路:采用先序遍历的递归方式,利用vector存储路径中的节点。需要注意的就是递归返回时要减去vector里面最后一个节点值,并移除节点。
测试代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
typedef struct node
{
struct node *lchild,*rchild;
int val;
}node,*BiTree;
BiTree Create(BiTree &T)//先序建立二叉树
{
int val;
scanf("%d",&val);
if(val==0) T=NULL;
else
{
T=(BiTree) malloc(sizeof(node));
T->val=val;
Create(T->lchild);
Create(T->rchild);
}
return T;
}
void Pre(BiTree T)//中序输出
{
if(T==NULL) return;
Pre(T->lchild);
printf("%d->",T->val);
Pre(T->rchild);
}
void FindPath(BiTree T,int sum,vector<int>path,int ans)//查找和为sum的所有路径
{
if(T==NULL) return;
ans+=T->val;//加入结点值并将结点加入vector中
path.push_back(T->val);
if(sum==ans&&T->lchild==NULL&&T->rchild==NULL)//判断到达叶子节点并且路径和为给定值
{
vector<int>::iterator it;//vector迭代器定义,不想这样也可以直接用auto需要C++11支持
for(it=path.begin();it!=path.end();it++)
printf("%d ",*it);
printf("\n");
}
if(T->lchild) FindPath(T->lchild,sum,path,ans);
if(T->rchild) FindPath(T->rchild,sum,path,ans);
ans-=path.back();//返回上一个节点时需要减去最后一个结点值并将其从vector中移除
path.pop_back();
}
int main()
{
int sum,ans=0;
vector<int>path;
cout<<"请按照先序遍历输入二叉树结点值:"<<endl;
BiTree T;
T=Create(T);
cout<<"中序输出二叉树序列:"<<endl;
Pre(T);
cout<<endl;
cout<<"请输入路径和:"<<endl;
scanf("%d",&sum);
FindPath(T,sum,path,ans);
}
//测试数据:15 6 8 0 0 0 3 3 0 0 0 21