题目描述
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
解题思路:这个题目的想法可以是按照先左节点后右节点依次遍历整个树,到达叶子节点,是正确答案就添加,没有就跳过。然后回溯到上一层,再遍历。
代码:
import java.util.ArrayList; public class FindPathInTree { public static void main(String args[]){ /* TreeNode node1=new TreeNode(5); node1.left=new TreeNode(2); node1.right=new TreeNode(1); node1.left.left=new TreeNode(7); node1.left.right=new TreeNode(3); node1.left.right.right=new TreeNode(4); node1.right.left=new TreeNode(8); node1.right.right=new TreeNode(11); node1.right.right.left=new TreeNode(6); node1.right.right.right=new TreeNode(9);*/ TreeNode node1=new TreeNode(10); node1.left=new TreeNode(5); node1.right=new TreeNode(12); node1.left.left=new TreeNode(4); node1.left.right=new TreeNode(7); ArrayList<ArrayList<Integer>> res=new FindPathInTree().FindPath(node1,22); for(int i=0;i<res.size();i++){ for(int j=0;j<res.get(i).size();j++){ System.out.print(res.get(i).get(j)+" "); } System.out.println(); } } ArrayList<ArrayList<Integer>>res=new ArrayList<>(); ArrayList<Integer> list=new ArrayList<>(); public ArrayList<ArrayList<Integer>> FindPath( TreeNode root, int target) { if(root==null) return res; list.add(root.val); //root.left == null && root.right == null保证是叶子节点 if(root.left == null && root.right == null && target == root.val) { //对res里面的进行排序,长度长的在前面 int i=0; for(;i<res.size();i++){ if(list.size()>res.get(i).size()){ res.add(i,new ArrayList<Integer>(list)); break; } } if(i==res.size()){ res.add(new ArrayList<Integer>(list)); } } //我这边遵循的是先左节点后右节点,其实顺序并没有关系 //没有到叶子节点就崽往下遍历 if(root.left != null){ FindPath(root.left,target-root.val); } if(root.right != null) { FindPath(root.right,target-root.val); } if(!list.isEmpty()){ //删除当前加入,回溯到父节点 list.remove(list.size()-1); } return res; } }