二叉树中和为某一值得所有路径

问题描述:给定一颗二叉树,求其中和为某一特定值得所有路径。路径定义为根到叶子的所有节点。

主要思路:采用先序遍历的递归方式,利用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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

童话ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值