1. 程式人生 > 實用技巧 >力扣 - 129. 求根到葉子節點數字之和

力扣 - 129. 求根到葉子節點數字之和

目錄

題目

129. 求根到葉子節點數字之和

思路1(DFS 深度優先搜尋)

  • 通過深度優先搜尋,自頂向下
  • 引數列表加了一個preSum引數,用於儲存上父節點的數的大小
  • 將preSum與本結點的val進行計算,得到一個結果,次結果作為下一個結點的父節點preSum引數,傳遞進去
  • 如果遍歷到空,就返回0
  • 否則返回的值就是兩個孩子的val相加

程式碼

class Solution {
    public int sumNumbers(TreeNode root) {
        return dfs(root, 0);
    }

    private int dfs(TreeNode node, int preSum) {
        if (node == null) {
            return 0;
        }
        int sum = preSum * 10 + node.val;
        if (node.left == null && node.right == null) {
            return sum;
        } else {
            return dfs(node.left, sum) + dfs(node.right, sum);
        }
    }
}

複雜度分析

  • 時間複雜度:\(O(N)\),其中 N 為結點數
  • 空間複雜度:\(O(N)\),其中 N 為結點數

思路2(BFS 廣度優先搜尋)

  • 通過廣度優先搜尋
  • 利用兩個佇列來實現,一個佇列儲存樹的結點,另一個儲存累計的值
  • 遍歷到末尾才將結果加入sum中

程式碼

class Solution {
    public int sumNumbers(TreeNode root) {
        if (root == null) {
            return 0;
        }
        
        Deque<TreeNode> q1 = new LinkedList<>();
        Deque<Integer> q2 = new LinkedList<>();
        q1.offer(root);
        q2.offer(root.val);
        // 用來計算總和
        int sum = 0;

        while (!q1.isEmpty()) {
            TreeNode node = q1.poll();
            int num = q2.poll();
            
            // 只有到達根節點才計算
            if (node.left == null && node.right == null) {
                sum += num;
            } else {
                // 否則的話講當前的值計算一下帶入到下一步運算中
                if (node.left != null) {
                    q1.offer(node.left);
                    q2.offer(num * 10 + node.left.val);
                }
                if (node.right != null) {
                    q1.offer(node.right);
                    q2.offer(num * 10 + node.right.val);
                }
            }
        }
        return sum;
    }
}

複雜度分析

  • 時間複雜度:\(O(N)\),其中 N 為結點數
  • 空間複雜度:\(O(N)\),其中 N 為結點數