题目描述
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
示例:
给定如下二叉树,以及目标和 sum = 22,
1 | 5 |
返回:
1 | [ |
题解
回溯法
这道题明显可以通过回溯算法进行遍历求解, 就是先序遍历+路径记录
首先考虑递归的终止条件, 需要注意的是题目中描述只有到达叶子节点才算一条完整的路径, 所以不必考虑路径中途停止的情况, 直接将终止条件设置成root == null
即可, 表示已经遍历穿了.
- 终止条件:
root== null
, 直接返回 - *递归过程: *
- 路径更新: 将当前的节点值加入路径中
- 目标更新: 将当前的目标值减去当前的节点值
- 判断路径是否满足条件: 若当前节点为叶子节点并且目标值为0, 则将当前路径加入到
res
列表中. - 遍历左右子节点
- 路径恢复
值得注意的是,记录路径时若直接执行 res.append(path) ,则是将 path 对象加入了 res ;后续 path 改变时, res 中的 path 对象也会随之改变。
正确做法:res.append(list(path)) ,相当于复制了一个 path 并加入到 res 。
1 | public class jz34 { |