力扣 - 129. 求根到葉子節點數字之和
阿新 • • 發佈:2020-11-16
目錄
題目
思路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 為結點數