二叉树中和为某一值的路径
Posted tianzeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树中和为某一值的路径相关的知识,希望对你有一定的参考价值。
题目
输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。例如输入下图中二叉树和整数22,则打印出两条路径,第一条路径包含结点10、12,第二条路径包含结点10、5和7。
思路
- 当用前序遍历的方式访问到某一结点时,我们把该结点添加到路径上,并累加该结点的值。
- 如果该结点为叶结点并且路径中结点值的和刚好等于输入的整数,则当前的路径符合要求,我们把它打印出来。如果当前结点不是叶结点,则继续访问它的子结点。
- 当前结点访问结束后,递归函数将自动回到它的父结点。这里要注意的是:在函数退出之前要在路径上删除当前结点并减去当前结点的值,以确保返回父结点时路径刚好是从根结点到父结点的路径。
#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; }
以上是关于二叉树中和为某一值的路径的主要内容,如果未能解决你的问题,请参考以下文章