码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-12-30 22:07:09      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:sum   ace   遍历   class   oid   img   输入   打印   分享   

题目

  输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。例如输入下图中二叉树和整数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;
}

 

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

标签:sum   ace   遍历   class   oid   img   输入   打印   分享   

原文地址:https://www.cnblogs.com/tianzeng/p/10200598.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!