二叉树中和为某一值的路径

题目描述:
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)     

                      

思路:

如上图,例如整数为26,根节点为12,那么,满足题意的路径有【12-5-9】,其他的都不符合,比如【12-5-2】.由此我们可以看出:

从根节点出发一直遍历到叶子节点,满足和为给出整数即可输出。

具体代码如下:

 1 import java.util.ArrayList;
 2 /**
 3 public class TreeNode {
 4     int val = 0;
 5     TreeNode left = null;
 6     TreeNode right = null;
 7 
 8     public TreeNode(int val) {
 9         this.val = val;
10 
11     }
12 
13 }
14 */
15 public class Solution {
16     public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
17         ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
18         if(null == root){
19             return list;
20         }
21         ArrayList<Integer> al = new ArrayList<Integer>();
22         int sum = 0;
23         FindPa(root,target,list,al,sum);
24         return list;
25     }
26      public void FindPa(TreeNode root,int target,ArrayList<ArrayList<Integer>> arr,
27                           ArrayList<Integer> al,int sum){
28          if(null == root){
29              return; 
30          }
31             sum += root.val; //根节点之和
32          if(null == root.left && null == root.right){ //已经到叶子节点
33              if(sum == target){
34                  al.add(root.val);
35                  arr.add(new ArrayList<Integer>(al));
36                  al.remove(al.size() - 1);//数组下标从0开始
37              }
38              return;
39          }
40             al.add(root.val);
41            FindPa(root.left,target,arr,al,sum); //遍历左孩子
42            FindPa(root.right,target,arr,al,sum); //遍历右孩子
43            al.remove(al.size() - 1);
44      }
45 }

注意:al.remove(al.size() - 1);因为数组的下标是从0开始,所以需要减1.不然就会出现下标越界的问题。

  ArrayList<ArrayList<Integer>> 内层放的是正确的路径节点,外层放的是路径中节点的个数。

 

posted @ 2019-01-06 14:37  离愁i  阅读(120)  评论(0编辑  收藏  举报