題目描述
輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。
代碼實現
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 {
ArrayList<Integer> path = new ArrayList<>();
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root == null)
return list;
//每訪問到一個結點的時候,都把當前的結點添加到路徑中去,并調整target的值
path.add(root.val);
target -= root.val;
//已到葉節點并且和為target,則把當前路徑添加到輸出列表里
//因為add添加的是引用,如果不new一個的話,最終list保存到的只是最后一個path
if(target == 0 && root.left == null && root.right == null)
list.add(new ArrayList<Integer>(path));
//否則繼續遍歷
FindPath(root.left, target);
FindPath(root.right, target);
//已到葉節點之后會跳過兩個遞歸函數到這里,此時要把最后一個結點從路徑中刪除,才能返回上層結點
path.remove(path.size()-1);
return list;
}
}
主要思路
1、這道題有點難度,首先記住一句話:在樹的前序、中序、后序遍歷中,只有前序遍歷是首先遍歷根結點的(因此需要先遍歷根結點的題,就是考查前序遍歷)
2、代碼注釋里寫的比較清楚了,首先就是要把當前結點(首先是根結點)添加到路徑里,同時target 減去當前結點的值;然后,如果當前結點為葉節點并且和也達到給定值,就把這個路徑添加到列表,否則就一直遍歷下去;最后,遍歷到葉節點之后,返回上層結點之前,一定要把最后一個結點從路徑中刪除
3、把符合條件的路徑添加到列表中的時候,因為add添加的是引用,如果不是每次都new一個path的話,最終list保存到的只是最后一個path(可以看一下ArrayList的源碼)