二叉树路径总和
前言
对于二叉树问题来说,遍历是它的基础,如找叶子节点就可以遍历找到。为了寻找根节点到所有叶子节点的路径,可用回溯来记录路径上的节点。
一、二叉树路径总和
二、回溯+寻找叶子节点
package everyday;
import java.util.ArrayList;
import java.util.List;
// 二叉树路径总合。
public class PathSum {
/*
target:从根节点到叶子节点,记录路径和为targetSum.
遍历为基础,以任意一种遍历 携带着 路径list/list总和(标准回溯)。
找到叶子节点根据targetSum来判断是否要这个list。
*/
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
// 回溯上的路径元素/总和。
List<Integer> el = new ArrayList<>();
// 记录满足条件的路径。
List<List<Integer>> paths = new ArrayList<>();
// 寻找叶子节点,并在此处记录符合条件的路径。
order(root, el, paths, targetSum);
// 返回符合条件的路径。
return paths;
}
private boolean order(TreeNode root, List<Integer> el, List<List<Integer>> paths, int target) {
// 递归到叶子节点的孩子节点上,以true示意,结束递归。
if (null == root) return true;
// 标准回溯代码。
// 加入路径
el.add(root.val);
// 获取左右孩子情况。
boolean flag = order(root.left, el, paths, target);
flag = order(root.right, el, paths, target) && flag;
if (flag) {
int total = 0;
for (Integer i : el) total += i;
if (target == total) paths.add(new ArrayList<>(el));
}
// 递归回溯到此,去除该root.val
el.remove(el.size() - 1);
// 用false示意非叶子节点。
return false;
}
// Definition for a binary tree node.
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {
}
TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
}
总结
1)回溯+寻找叶子节点。
参考文献
[1] LeetCode 二叉树路径总和