二叉树中和为某一值的路径

来源:互联网 发布:linux mysql 注册服务 编辑:程序博客网 时间:2024/05/18 17:00

题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

思路:

使用变量存放当前遍历的路径和,当访问到某一结点时,把该结点添加到路径上,并累加当前结点的值。如果当前结点为叶结点并且当前路径的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。当前结点访问结束后,递归函数将自动回到父结点,因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是根结点到父结点的路径。

#include<iostream>#include<vector>#include<stdlib.h>using namespace std;typedef struct BiTNode{        int data;        struct BiTNode* lchild;        struct BiTNode* rchild;}BiTNode,*BiTree;void FindPath1(BiTNode* root,int expectedsum,int currentsum, vector<int> &path);void CreateBiTree(BiTree &root){        int ch;        cin>>ch;        if(ch==0)                root=NULL;        else        {                root=(BiTNode*)malloc(sizeof(BiTNode));                root->data=ch;                cout<<"输入"<<ch<<"的左子树:";                CreateBiTree(root->lchild);                cout<<"输入"<<ch<<"的右子树:";                CreateBiTree(root->rchild);        }}void FindPath(BiTNode* root,int expectedsum){        if(root==NULL)                return ;        vector<int> path;        int currentsum=0;        FindPath1(root,expectedsum,currentsum,path);}void FindPath1(BiTNode* root,int expectedsum,int currentsum, vector<int> &path){        currentsum+=root->data;        path.push_back(root->data);        bool isLeaf=root->lchild==NULL&&root->rchild==NULL;        if(currentsum==expectedsum && isLeaf)        {                cout<<"path is:";                vector<int>::iterator iter;                for(iter=path.begin();iter!=path.end();iter++)                        cout<<*iter<<"\t";                cout<<endl;        }        if(root->lchild)                FindPath1(root->lchild,expectedsum,currentsum,path);        if(root->rchild)                FindPath1(root->rchild,expectedsum,currentsum,path);        path.pop_back();}int main(){        BiTNode* root=NULL;        int len;        CreateBiTree(root);        cout<<"期待的路径长度:";        cin>>len;        FindPath(root,len);        return 0;}


原创粉丝点击