劍指offer23-二叉樹中和爲某一值的路徑
最近全國疫情嚴重,待在家裏沒事幹,馬上又要準備春招了,最近刷刷題,記錄一下!再說一句,武漢加油,大家出門記得戴口罩!
1、題目描述
輸入一顆二叉樹的根節點和一個整數,打印出二叉樹中結點值的和爲輸入整數的所有路徑。路徑定義爲從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,數組長度大的數組靠前)
2、思路分析
首先思考節點值的和爲輸入的整數,每條路徑都一定是從根節點到葉子節點,在數據結構中從根節點到葉子節點的遍歷稱之爲深度優先遍歷DFS。因此整個過程可以採用先序遍歷方式的DFS,即根節點》左子樹》右子樹。隨後考慮一次遍歷完成後的處理,當一次遍歷完成後,如果輸入整數值恰好等於節點值之和,則輸出這條路徑並且回退一個節點;如果不等於則直接回退一個節點,即回退到當前節點的父節點,如果該父節點有右孩子,則繼續遍歷,否則繼續回退。考慮回退到根節點,此時如果它有右孩子,則繼續遍歷,否則整個DFS結束。
3、代碼
public class Solution {
ArrayList<ArrayList<Integer>> alist=new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list=new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
//判斷邊界
if(root==null)
return alist;
list.add(root.val);
if(root.val==target&&root.left==null&&root.right==null)
alist.add(new ArrayList<Integer>(list));
if(root.val<=target&&root.left!=null) {
FindPath(root.left,target-root.val);
}
if(root.val<=target&&root.right!=null) {
FindPath(root.right,target-root.val);
}
list.remove(list.size()-1);
return alist;
}
}