Binary Tree Path Sum
Analysis:
这道题不难,但是我对于数结构以及递归掌握还是不够好,无法举一反三。
这道题要求所有的path,可以想到排列组合问题,所以可以套用排列组合模板。 但是因为这个是树结构,所以在套用的时候,要左右子树各走一遍。
这道题也是树的问题,用递归的时候要考虑三要素,递归的定义,递归的拆解,递归的出口。
定义: 就是用前序遍历的方法,把所有的node的值从根左右的方法相加,看是否与target相等。
拆解:左右两棵树。
出口; 当数走到叶子的时候,就可以看到这个path相加的结果是否和target相等。如果相等就把这个path加到结果里。如果不是则自然退出。
有的时候如果break很难处理(sum已经大于target),可以暂时不处理,就让程序跑完,对于时间复杂度影响有限,但是想的时候就比较简单,不用特别考虑什么时候break。
/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */ public class Solution { /** * @param root the root of binary tree * @param target an integer * @return all valid paths */ public List<List<Integer>> binaryTreePathSum(TreeNode root, int target) { // Write your code here List<List<Integer>> rst = new ArrayList<>(); if (root == null) { return rst; } ArrayList<Integer> path = new ArrayList<Integer>(); path.add(root.val); helper(root, rst, path, root.val, target); return rst; } private void helper(TreeNode root, List<List<Integer>> rst, ArrayList<Integer> path, int sum, int target) { if (root.left == null && root.right == null) { if (sum == target) { rst.add(new ArrayList<Integer>(path)); } } if (root.left != null) { path.add(root.left.val); helper(root.left, rst, path, sum + root.left.val, target); path.remove(path.size() - 1); } if (root.right != null) { path.add(root.right.val); helper(root.right, rst, path, sum + root.right.val, target); path.remove(path.size() -1); } } }
posted on 2017-03-15 01:22 codingEskimo 阅读(138) 评论(0) 收藏 举报
浙公网安备 33010602011771号