34 二叉树中和为某一值的路径
题目
输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。例如输入下图中二叉树和整数22,则打印出两条路径,第一条路径包含结点10、12,第二条路径包含结点10、5和7。
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> > FindPath(TreeNode* root,int expectNumber) {
vector<vector<int> > res;
vector<int> path;
if(root != nullptr)
dfs(root,expectNumber,res,path);
return res;
}
// 注意此处传入的是引用
void dfs(TreeNode* root,int expectNumber,vector<vector<int> >& res,vector<int>& path)
{
path.push_back(root->val);
// 如果是叶节点,并且值满足期待的值则找到了一条路径
if(root->val == expectNumber && root->left == nullptr && root->right == nullptr)
{
res.push_back(path);
}
// 左子树,右子树分别查找,注意传递进去的目标值为差值
if(root->left != nullptr)
{
dfs(root->left,expectNumber - root->val, res,path);
}
if(root->right != nullptr)
{
dfs(root->right,expectNumber - root->val, res,path);
}
// 节点回退
path.pop_back();
}
};
python 题解
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回二维列表,内部每个列表表示找到的路径
def FindPath(self, root, expectNumber):
# write code here
if not root:
return []
result=[]
def FindPathCore(root,path,currentNum):
currentNum += root.val
path.append(root)
# 判断是否达到叶子节点
flag = (root.left==None and root.right==None)
#如果到达叶子节点且当前值等于期望值
if currentNum==expectNumber and flag:
onepath=[]
for node in path:
onepath.append(node.val)
result.append(onepath)
# 这一句判断很重要,能够加速查找
if currentNum<expectNumber:
if root.left:
FindPathCore(root.left,path,currentNum)
if root.right:
FindPathCore(root.right,path,currentNum)
path.pop()
currentNum -= root.val
FindPathCore(root,[],0)
return result