给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1
返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
这类问题可以用带记忆的DFS来解决。分享一个这类问题的典型解法。
1、思路
深度优先搜索。使用前序遍历,使用两个全局变量result和tmp,result来存放最终结果,tmp用来存放临时结果。
每次遍历,我们先把root的值压入tmp,然后判断当前root是否同时满足:
- 与给定数值相减为0;
- 左子树为空;
- 右子树为空。
如果满足条件,就将tmp压入result中,否则,依次遍历左右子树。需要注意的是,遍历左右子树的时候,全局变量tmp是不清空的,直到到了根结点才请空tmp。
class Solution {
public:
vector<vector<int> > FindPath(TreeNode* root,int expectNumber){
if(root == NULL){
return result;//节点为空的情况先判断
}
tmp.push_back(root->val);//节点不为空就放进去
if((expectNumber - root->val ) == 0 && root->left == NULL && root->right == NULL){
result.push_back(tmp);//当完成时应该是相减为0并且左右都空了,临时的就是最后的结果
}
//遍历左子树
FindPath(root->left, expectNumber - root->val);//否则接着向下走,
//遍历右子树
FindPath(root->right, expectNumber - root->val);
tmp.pop_back();//走完了之后,这一条已经判断完了,
return result;
}
private:
vector<vector<int> > result;
vector<int> tmp;
};