题目
描述
输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n
如二叉树root为{10,5,12,4,7},expectNumber为22
则合法路径有[[10,5,7],[10,12]]
数据范围:
树中节点总数在范围 [0, 5000] 内
-1000 <= 节点值 <= 1000
-1000 <= expectNumber <= 1000
思路
采用先序深度优先遍历的方法,递归过程中更新target值和节点,到叶子结点的时候判断路径是否满足条件,满足条件的路经记录下来。
代码
python版本:
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param root TreeNode类
# @param target int整型
# @return int整型二维数组
#
class Solution:
res = []
def FindPath(self , root: TreeNode, target: int) -> List[List[int]]:
# write code here
path = []
self.preorder(root, target, path)
return self.res
def preorder(self, root: TreeNode, target: int, path):
if(root==None):
return
path.append(root.val)
self.preorder(root.left, target-root.val, path)
self.preorder(root.right, target-root.val, path)
if(root.left==None and root.right==None and target-root.val==0):
self.res.append(path[:])
path.pop()
c++版本:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
vector<vector<int>> all_path;
vector<vector<int>> FindPath(TreeNode* root,int expectNumber) {
vector<int> path={};
this->preorder(root, expectNumber, path);
return all_path;
}
void preorder(TreeNode* root,int expectNumber, vector<int> &path){
if(root==nullptr){
return;
}
path.push_back(root->val);
this->preorder(root->left, expectNumber-root->val, path);
this->preorder(root->right, expectNumber-root->val, path);
if(root->left==nullptr && root->right==nullptr && expectNumber-root->val==0){
this->all_path.push_back(path);
}
path.pop_back();
}
};