剑指offer——二叉树中和为某一值的路径
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
解:在这个题目中,求二叉树指定路径,判断条件就是在叶子结点处,此时target==0
而要想求一棵二叉树一条路径的长度的话,只有前序遍历可以实现,故在利用递归来进行二叉树的前序遍历,然后求解和,且求解时,先将该结点加入到list中,然后分别递归左右结点,计算加入该结点之后,target的值是否与路径的和相等
编程时注意要点:
1.list的删除:开始时使用的是list.remove(list.size() -
1
);,这样是不对的
应该用list.remove(list.size() - 1);来删除最后一个结点,进行回退。
2.ArrayList<ArrayList<Integer>> arrayLists的添加,开始时用的是
arrayLists.add(list); 就是添加不上去
后来看答案;使用的是arrayLists.add(new ArrayList<>(list));(依然想不明白)
import java.util.ArrayList; /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) { ArrayList<ArrayList<Integer>> arrayLists = new ArrayList<>(); if(root == null) return arrayLists; ArrayList<Integer> list = new ArrayList<>(); getPath(arrayLists, list, root, target); return arrayLists; } public void getPath(ArrayList<ArrayList<Integer>> arrayLists, ArrayList<Integer> list, TreeNode root, int target){ if(root == null){ return; } list.add(root.val); target -= root.val; if(target == 0 && root.left == null && root.right == null){ arrayLists.add(new ArrayList<>(list)); } else{ getPath(arrayLists, list, root.left, target); getPath(arrayLists, list, root.right, target); } list.remove(list.size() - 1); } }
重新写的,没想用先序遍历
public class Solution { public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) { ArrayList<ArrayList<Integer>> res = new ArrayList<>(); if(root == null || target == 0) return res; ArrayList<Integer> path = new ArrayList<>(); findPath(root, target, res, path); return res; } public void findPath(TreeNode root, int target, ArrayList<ArrayList<Integer>> res, ArrayList<Integer> path){ if(root == null) return; if(root.left == null && root.right == null){ if(target == root.val){ path.add(root.val); ArrayList<Integer> help = new ArrayList<>(); for(int i = 0; i < path.size(); i++){ help.add(path.get(i)); } res.add(help); path.remove(path.size()-1); } return; } path.add(root.val); findPath(root.left, target-root.val, res, path); findPath(root.right, target-root.val, res, path); path.remove(path.size()-1); } }