1. 程式人生 > >[劍指offer] --25.二叉樹中和為某一值的路徑

[劍指offer] --25.二叉樹中和為某一值的路徑

題目描述

輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。

路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前)

解題思路

  • 每次先把開始的頭結點儲存,然後使用輸入的路徑減去頭結點的值獲得剩餘的路徑
  • 當路徑為0且到達葉子結點,說明該路徑符合要求,儲存到集合列表中
  • 否則,使用遞迴繼續往下訪問
  • 記得刪除當前結點保證返回的路徑剛好是從根結點到父結點的路徑
public class Solution {
    private ArrayList<ArrayList<Integer>> listAll = new ArrayList<>();
    private ArrayList<Integer> list = new ArrayList<>();

    public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
        if (root == null) {
            return listAll;
        }
        list.add(root.val);
        //減去頭結點的值
        target -=root.val;
        if (target == 0 && root.left == null && root.right == null) {
            //當輸入路徑為0且到達葉子結點時,說明當前路徑符合要求,
            listAll.add(new ArrayList<>(list));
        }
        //如果不是葉子結點,遞迴繼續訪問子結點
        FindPath(root.left,target);
        FindPath(root.right,target);
        //將當前結點刪除保證返回的路徑剛好是從根結點到父結點的路徑
        list.remove(list.size()-1);
        return listAll;
    }
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

        public TreeNode(int val) {
            this.val = val;

        }

    }