标签:sum ace 遍历 class oid img 输入 打印 分享
输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。例如输入下图中二叉树和整数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; }
标签:sum ace 遍历 class oid img 输入 打印 分享
原文地址:https://www.cnblogs.com/tianzeng/p/10200598.html