[剑指 Offer 第 2 版第 34 题] “二叉树中和为某一值的路径”做题记录
[剑指 Offer 第 2 版第 34 题] “二叉树中和为某一值的路径”做题记录
第 34 题:二叉树中和为某一值的路径
传送门:二叉树中和为某一值的路径,牛客网 online judge 地址。
输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
样例
给出二叉树如下所示,并给出num=22。
5 / \ 4 6 / / \ 12 13 6 / \ / \ 9 1 5 1
输出:[[5,4,12,1],[5,6,6,5]]
Python 代码:
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution(object):
def findPath(self, root, sum):
"""
:type root: TreeNode
:type sum: int
:rtype: List[List[int]]
"""
res = []
if root is None:
return res
self.__dfs(root, sum, [], res)
return res
def __dfs(self, node, residue, path, res):
# 递归,就应该先写递归终止条件
if node is None:
return
# 走到这里 node 肯定非空,所以可以使用 left 和 right 成员变量
# 走完以后,要记得回溯,状态要重置
# 先把它加到路径中,在各种 if 都不成立的最后,要记得 pop 出去
path.append(node.val)
if node.left is None and node.right is None:
# 如果是叶子结点,并且 residue 就等于当前结点的值
if node.val == residue:
res.append(path[:])
# 注意:这里不要 return ,如果要 return,return 之前把 path 执行 pop 操作
# 走到这里是非叶子结点,所以左边要走一走,右边也要走一走
if node.left:
self.__dfs(node.left, residue - node.val, path, res)
if node.right:
self.__dfs(node.right, residue - node.val, path, res)
path.pop()
Java 代码:
import java.util.ArrayList;
import java.util.Stack;
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Solution {
// 使用搜索的策略可以完成
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
Stack<Integer> pre = new Stack<>();
findPath(root, target, pre, res);
return res;
}
private void findPath(TreeNode root, int target, Stack<Integer> pre, ArrayList<ArrayList<Integer>> res) {
if (root == null || root.val > target) {
return;
}
// 注意:题目中问的是到叶子结点
if (root.val == target && root.left == null && root.right == null) {
pre.add(root.val);
res.add(new ArrayList<>(pre));
pre.pop();
return;
}
assert root.val < target && root != null;
pre.add(root.val);
findPath(root.left, target - root.val, pre, res);
findPath(root.right, target - root.val, pre, res);
pre.pop();
}
public static void main(String[] args) {
TreeNode node1 = new TreeNode(1);
TreeNode node2 = new TreeNode(2);
TreeNode node3 = new TreeNode(3);
TreeNode node4 = new TreeNode(4);
TreeNode node8 = new TreeNode(8);
TreeNode node7 = new TreeNode(7);
node1.left = node2;
node1.right = node3;
node2.left = node4;
node2.right = node8;
node3.left = node7;
Solution solution = new Solution();
ArrayList<ArrayList<Integer>> findPath = solution.FindPath(node1, 11);
System.out.println(findPath);
}
}
参考资料:LeetCode 第 113题:路径总和 II。
作者:liweiwei1419
来源:https://liweiwei1419.github.io/sword-for-offer/
看完两件小事
如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:
- 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
- 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
本文著作权归作者所有,如若转载,请注明出处
转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com