二叉樹中和為某一值的路徑
題目描述
輸入一顆二叉樹和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。
注意:
1.路徑的定義:從樹的根結點開始往下一直到葉結點
2.樹的遍歷
3.路徑的保存:每次找到路徑之后,應將路徑保存到 ArrayList<ArrayList<Integer>> result 中,最終打印全部路徑
思路:
1.判斷樹是否為null、是否只有根節點
2.用前序遍歷方法,可以首先訪問節點,然后將節點入隊列(或棧均可),並將數值和之前入隊列的總和num相加 ps:個人傾向於棧,但由於在牛客網上刷題,該題返回值為隊列,故使用隊列,其實都差不多。棧可直接用pop將該最后加入棧的節點彈出,隊列則使用move(list.size()-1)將最后入隊的節點彈出。
3.判斷當前之和否滿足給定值,判斷當前節點是否葉節點。 若當前值等於給定值,且當前節點是葉節點,則打印路徑信息; 若當前值小於給定值,且當前節點不是葉節點,則遞歸調用該節點的左右子樹; 若當前值大於給定值,無需遞歸了(在默認節點值為正數的情況下)
代碼:
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<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> arr = new ArrayList<Integer>();
int num = 0;
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root==null){
return result;
}
boolean isLeaf = root.left==null&&root.right==null;
num+=root.val;
arr.add(root.val);
if(num==target&&isLeaf){
ArrayList<Integer> path = new ArrayList<Integer>();
for(int i=0;i<arr.size();i++){
path.add(arr.get(i));
}
result.add(path);
}
if(num<target&&root.left!=null){
FindPath(root.left,target);
}
if(num<target&&root.right!=null){
FindPath(root.right,target);
}
num-=root.val;
arr.remove(arr.size()-1);
return result;
}
}
