剑指offer 二叉树中和为某一值的路径
作者:互联网
1.题目
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
2.我的题解
深度优先遍历,遍历的时候判断是否符合条件,是就将路径加入结果。
注意:递归结束时,若以空节点终止递归,那么一条路径将会加入两次,必须要去除掉一次,这是我想的一个比较low的方法。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
vector<vector<int> > res_;
vector<int> path;
int sum;
bool isPush=true;
void dfs(TreeNode * root,int expect){
if(!root){
if(isPush&&sum==expect){
res_.push_back(path);
isPush=false;
}
return;
}
isPush=true;
sum+=root->val;
path.push_back(root->val);
dfs(root->left,expect);
dfs(root->right,expect);
sum-=root->val;
path.pop_back();
}
public:
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
if(!root)return res_;
dfs(root,expectNumber);
return res_;
}
};
3.别人的题解
别人怎么做的呢?
- 和的处理:不计算和,而是每次将期待的值减小,到达叶子结点如果减到0了说明该路径符合条件。
- 终止判断:判断当前节点的左右节点均为空(即为叶子节点),可以避免一条路径加入两次结果的尴尬。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
vector<vector<int> > res_;
vector<int> path;
public:
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
if(!root)return res_;
path.push_back(root->val);
expectNumber-=root->val;
if(expectNumber==0 && !root->left && !root->right)
res_.push_back(path);
FindPath(root->left,expectNumber);
FindPath(root->right,expectNumber);
path.pop_back();
return res_;
}
};
4.总结与反思
(1)某些值的和等于X等价于将X一个个减去这些值最后得到0。
永封 发布了31 篇原创文章 · 获赞 0 · 访问量 300 私信 关注标签:TreeNode,val,offer,int,res,二叉树,path,root,一值 来源: https://blog.csdn.net/weixin_43951240/article/details/104081183