本文共 2129 字,大约阅读时间需要 7 分钟。
给定一棵二叉树根节点root,以及一个整数sum。要求找出所有从根节点到叶子节点路径上数字之和为sum的路径,从上至下输出路径上的值。例子:
回溯法。
假设遍历到的当前节点记为node,使用subSum记录root到node的和(不包括node的值)。则可有如下几种情况进行分析:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public List
> pathSum(TreeNode root, int sum) { List
> res = new ArrayList<>(); pathSum(root, 0, sum, res, new LinkedList<>()); return res; } public void pathSum(TreeNode root, int subSum, int sum, List
> res, LinkedList l) { if (root == null) return ; // 当前节点是一个叶子节点 if (root.left == null && root.right == null) { if (subSum + root.val == sum) { l.addLast(root.val); res.add(new ArrayList<>(l)); l.removeLast(); } return ; } l.addLast(root.val); pathSum(root.left, subSum + root.val, sum, res, l); pathSum(root.right, subSum + root.val, sum, res, l); l.removeLast(); // 回溯 }}
回溯法。应该是可以不需要subSum这个变量的,只需要使用sum依次减去当前节点值即可。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public List
> pathSum(TreeNode root, int sum) { List
> res = new ArrayList<>(); pathSum(root, sum, res, new LinkedList<>()); return res; } public void pathSum(TreeNode root, int sum, List
> res, LinkedList l) { if (root == null) return ; // 当前节点是一个叶子节点 if (root.left == null && root.right == null) { if (sum == root.val) { l.addLast(root.val); res.add(new ArrayList<>(l)); l.removeLast(); } return ; } l.addLast(root.val); pathSum(root.left, sum - root.val, res, l); pathSum(root.right, sum - root.val, res, l); l.removeLast(); // 回溯 }}
转载地址:http://wxesi.baihongyu.com/