題目描述:
輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和爲輸入整數的所有路徑。路徑定義爲從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,數組長度大的數組靠前)
分析:
整體思路:
定義一個要返回的指定類型(ArrayList<ArrayList<Integer>>)的對象result,在定義一個ArrayList<Integer>類型的對象list,list的作用是爲了遍歷時記錄節點,然後找到符合條件的節點路徑,最後直接調用result 的 add 方法把符合條件的 list 添加到 result 中。
找路徑的具體思路:
1. 判斷給定的二叉樹是否爲空,如果根節點都爲空的話,那麼就直接返回null。
2.如果不爲空,將根節點放入list中,用當前的target減去當前根節點的val值來作爲新的target值,利用的是減法來計算,直到target減爲零並且當前節點必須沒有左右孩子(即葉子節點),此時就將list添加到result中,再將result返回。如果一直遍歷到葉子節點,target都沒有剛好爲零,那麼就還是返回result,但是result中是沒有值的。
代碼:
import java.util.*;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list = new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root == null){
return result;
}
list.add(root.val);
target -= root.val;
if(target == 0 && root.left ==null && root.right == null ){
result.add(new ArrayList<Integer>(list));
}
FindPath(root.left,target);
FindPath(root.right,target);
list.remove(list.size()-1);
return result;
}
}