題目描述
輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和爲輸入整數的所有路徑。路徑定義爲從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,數組長度大的數組靠前)
例如,求路徑和爲22:
有兩條:10->5->7、10->12
由於路徑是從根節點開始到葉節點的,要想到是用前序遍歷,同時需要記錄下當前的路徑,當遍歷到葉節點時判斷即可。
import java.util.ArrayList;
/**
* @author yuan
* @date 2019/2/17
* @description
*/
public class 二叉樹中和爲某一值的路徑 {
static class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
dfs(root, target, new ArrayList<>(), 0, result);
return result;
}
/**
* 用前序遍歷,因爲前序是先訪問根節點
* @param root
* @param target
* @param list 記錄當前的一條路徑
* @param cur 記錄當前一條路徑的和
* @param result 結果
*/
private void dfs(TreeNode root, int target, ArrayList<Integer> list, int cur, ArrayList<ArrayList<Integer>> result) {
if (root == null) {
return;
}
cur += root.val;
// 如果葉節點
if (root.left == null && root.right == null && cur == target) {
ArrayList<Integer> li = new ArrayList<>(list);
li.add(root.val);
result.add(li);
return;
}
// 把當前節點保存下來,繼續遍歷節點的左右子樹
list.add(root.val);
if (root.left != null) {
dfs(root.left, target, list, cur, result);
}
if (root.right != null) {
dfs(root.right, target, list, cur, result);
}
// 返回上一個父節點前,需要路徑上刪除當前節點
list.remove(list.size() - 1);
}
}