題目:二叉樹中和爲某一值的路徑
題目描述
輸入一顆二叉樹的根節點和一個整數,打印出二叉樹中結點值的和爲輸入整數的所有路徑。路徑定義爲從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,數組長度大的數組靠前)
解題思路:
遞歸先序遍歷樹, 把結點加入路徑。
若該結點是葉子結點則比較當前路徑和是否等於期待和。
彈出結點,每一輪遞歸返回到父結點時,當前路徑也應該回退一個結點
代碼實現:
import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
ArrayList<ArrayList<Integer>> list=new ArrayList<>();
if(root==null) {
return list;
}
ArrayList<Integer> al=new ArrayList<>();
getRes(list,al,root,target);
return list;
}
private void getRes(ArrayList<ArrayList<Integer>> list, ArrayList<Integer> al, TreeNode root, int target) {
if(root==null) {
return;
}
//將節點加入到路徑中
al.add(root.val);
//計算此時的target
target-=root.val;
//如果此時的target==0 且該節點是葉子節點,則找到該路徑
if(target==0 &&(root.left==null && root.right==null)) {
list.add(new ArrayList<>(al));
}
//左子樹
getRes(list,al,root.left,target);
//右子樹
getRes(list,al,root.right,target);
//退回父節點
al.remove(al.size()-1);
}
}