题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
解答:
数组长度大的数组靠前 ???这个问题让我想了很久,一开始想到把左右子节点中小的节点放在前面遍历,但是不代表小的节点的子节点也一定就是小,所以推翻了这个想法。最后终于想到了方法。。。把结果再排个序!!!!哈哈哈,我下不去手,这可太low了吧。于是我终于放弃了 :( :(
看完题解发现这条件是个假的???好吧那就深度遍历就可以了。
自己写了一遍,记录一下踩的坑。
public class Q_24 {
private ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>(); private ArrayList<Integer> path = new ArrayList<Integer>(); public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) { if (root == null) return list; path.add(root.val); if (target == root.val && root.left == null && root.right == null) { //这里要new一个list,才能在堆中创建一个新的数组。path是在常量池中,每个方法栈共享,最后会导致结果出错 list.add(new ArrayList<>(path)); } if (target > root.val) { if (root.left != null) { FindPath(root.left, target - root.val); path.remove(path.size() - 1); } if (root.right != null) { FindPath(root.right, target - root.val); path.remove(path.size() - 1); } } return list; } public static void main(String[] args) { TreeNode node_10 = new TreeNode(10); TreeNode node_5 = new TreeNode(5); TreeNode node_12 = new TreeNode(12); TreeNode node_4 = new TreeNode(4); TreeNode node_7 = new TreeNode(7); node_10.left = node_5; node_10.right = node_12; node_5.left = node_4; node_5.right = node_7; System.out.println(new Q_24().FindPath(node_10, 22)); }
}