剑指offer系列22--二叉树中和为某一值的路径

22【题目】输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
*     路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径
* 【思路】只要从根结点到叶结点一条一条遍历;
*      如果到了叶结点,且此路径值跟目标值相同,就添加此路径;
     不是,则从孩子子节点开始查找。

   【注】叶结点遍历完后要删除此叶结点值直至返回到父节点。

 1 package com.exe5.offer;
 2 
 3 import java.util.ArrayList;
 4 
 5 /**
 6  * 22【题目】输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。
 7  *          路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径
 8  *   【思路】只要从根结点到叶结点一条一条遍历;
 9  *          如果到了叶结点,且此路径值跟目标值相同,就添加此路径;
10                         不是,则从孩子子节点开始查找。
11  * @author WGS
12  *
13  */
14 public class FindTreePath {
15 
16     public static class TreeNode{
17         int val=0;
18         TreeNode left=null;
19         TreeNode right=null;
20         public TreeNode(int n){
21             this.val=n;
22         }
23     }
24     public ArrayList<ArrayList<Integer>> getFindPaths(TreeNode root,int target){
25         ArrayList<Integer> nodeList=new ArrayList<>();
26         ArrayList<ArrayList<Integer>> pathList=new ArrayList<>();
27         if(root==null) return pathList;    
28         int currentSum=0;
29         return findPaths(pathList,nodeList,root,target,currentSum);
30         
31     }
32     private ArrayList<ArrayList<Integer>> findPaths(ArrayList<ArrayList<Integer>> pathList, ArrayList<Integer> nodeList,
33             TreeNode root, int target, int currentSum) {
34 
35         currentSum+=root.val;
36         nodeList.add(root.val);
37         //如果是叶结点就判断与目标值是否相同,相同则添加此路径
38         boolean isLeafNode=root.left==null && root.right==null;
39         if(currentSum==target && isLeafNode==true){
40             ArrayList<Integer> tempList=new ArrayList<>();
41             for(Integer val:nodeList){
42                 tempList.add(val);
43             }
44             //循环结束为一条路径,加到pathList
45             pathList.add(tempList);
46         }
47         //如果不是叶结点,则使用递归继续判断左右子节点
48         if(root.left!=null)
49             findPaths(pathList, nodeList, root.left, target, currentSum);
50         if(root.right!=null)
51             findPaths(pathList, nodeList, root.right, target, currentSum);
52         
53         //遍历到叶结点后,要在返回到父节点之前,在路径上删除当前结点
54         Integer val2=nodeList.remove(nodeList.size()-1);
55         currentSum-=val2;
56         return pathList;
57     }
58     
59     public static void main(String[] args) {
60         TreeNode root=new TreeNode(10);
61         TreeNode node1=new TreeNode(5);
62         TreeNode node2=new TreeNode(4);
63         TreeNode node3=new TreeNode(7);
64         TreeNode node4=new TreeNode(12);
65         root.left=node1;
66         root.right=node4;
67         node1.left=node2;
68         node1.right=node3;
69         
70         //ArrayList<ArrayList<Integer>> getList=new FindTreePath().getFindPaths(root, 22);
71         ArrayList<ArrayList<Integer>> getList=new FindTreePath().getFindPaths(null, 0);
72         System.out.println(getList.size());
73         
74         for (ArrayList<Integer> list : getList) {
75             for (Integer integer : list) {
76                 System.out.print(integer+" ");
77             }
78             System.out.println();
79         }
80     }
81 
82 }
原文地址:https://www.cnblogs.com/noaman/p/5461336.html