面試題34:二叉樹中和為某一值的路徑

鹹魚不會游泳發表於2020-12-04

題目:輸入一棵二叉樹和一個整數,列印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。

思路:先序遍歷樹,用全域性變數LinkedList型別的 path 來記錄路徑,暴力回溯,tar 不停的遞減,直到 tar 為 0 並且當前結點為葉子結點,那麼找到正確的路徑 path,將其存入結果集中。

  • 時間複雜度O(n),遍歷書中每個結點的時間複雜度
  • 空間複雜度O(n),需要定義一個輔助陣列 path ,來儲存路徑,結果集不算再空間複雜度裡面。
class Solution {
    // 定義兩個全域性變數比較好儲存並且返回,不用通過傳參或者函式返回值來修改
    public LinkedList<List<Integer>> res = new LinkedList<>();
    public LinkedList<Integer> path = new LinkedList<>();
    
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
        recur(root, sum);
        return res;
    }
    
    // 不要寫成 static ,不然裡面定義的成員都是 static 的,全域性變數的多個測試用例就會發生錯誤
    void recur(TreeNode root, int tar) {
        if (root == null) {
            return ;
        }
        path.add(root.val);
        tar -= root.val;
        if (tar == 0 && root.left == null && root.right == null) {
            res.add(new LinkedList(path));
        }
        recur(root.left, tar);
        recur(root.right, tar);
        // 因為 path 是全域性變數,當前結點遍歷完了,一定要進行回溯,
        path.removeLast();
        return ;
    }
}

相關文章