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

Posted tianzeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树中和为某一值的路径相关的知识,希望对你有一定的参考价值。

题目

  输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。例如输入下图中二叉树和整数22,则打印出两条路径,第一条路径包含结点10、12,第二条路径包含结点10、5和7。

思路

技术分享图片

  1. 当用前序遍历的方式访问到某一结点时,我们把该结点添加到路径上,并累加该结点的值。
  2. 如果该结点为叶结点并且路径中结点值的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。
  3. 当前结点访问结束后,递归函数将自动回到它的父结点。这里要注意的是:在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是从根结点到父结点的路径。
#include <iostream>
#include <vector>
using namespace std;

struct tree
{
    double data;
    struct tree *left,*right;
    tree(int d=0):data(d)
    {
        left=right=nullptr;
    }
};
class Solution
{
    public:
        void create(tree *&root);
        void pre_order(tree *root);//中序遍历
        void find_path(tree *root,int sum);
        void find_path(tree *root,int sum,vector<int> &path,int curr_sum);
        tree *root;    
};
void Solution::create(tree *&root)
{
    double x;
    cin>>x;
    if(x==0)
        root=nullptr;
    else
    {
        root=new tree();
        root->data=x;
        create(root->left);
        create(root->right);
    }
}
void Solution::pre_order(tree *root)
{
    if(root)
    {
        cout<<root->data<<endl;
        pre_order(root->left);
        pre_order(root->right);
    }
}
void Solution::find_path(tree *root,int sum)
{
    if(!root)
        return ;
    vector<int> path;
    int curr_sum=0;
    find_path(root,sum,path,curr_sum);
}
void Solution::find_path(tree *root,int sum,vector<int> &path,int curr_sum)
{
    curr_sum+=root->data;
    path.push_back(root->data);
    
    bool flag=root->left==nullptr&&root->right==nullptr;
    if(curr_sum==sum&&flag)
    {
        cout<<"find path:";
        for(auto it=path.begin();it!=path.end();++it)
            cout<<*it<<" ";
        cout<<endl;
    }
    
    if(root->left!=nullptr)
        find_path(root->left,sum,path,curr_sum);
    if(root->right!=nullptr)
        find_path(root->right,sum,path,curr_sum);
    
    //加不加都可以,因为curr_sum是局部变量,每次递归结束后本层递归时curr_sum的值消失
    //返回上层递归时curr_sum的值
    curr_sum-=root->data; 
    path.pop_back();
}

int main()
{
    Solution s;
    s.create(s.root);
    //s.pre_order(s.root);
    s.find_path(s.root,22);
    return 0;
}

 

以上是关于二叉树中和为某一值的路径的主要内容,如果未能解决你的问题,请参考以下文章

二叉树中和为某一值的路径-剑指Offer

34二叉树中和为某一值的路径 //代码未通过

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

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

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

剑指offer---二叉树中和为某一值的路径