[leetCode]129. 求根到葉子節點數字之和
阿新 • • 發佈:2020-10-29
csdn: https://blog.csdn.net/renweiyi1487/article/details/109351021
題目
連結:https://leetcode-cn.com/problems/sum-root-to-leaf-numbers
給定一個二叉樹,它的每個結點都存放一個 0-9 的數字,每條從根到葉子節點的路徑都代表一個數字。
例如,從根到葉子節點路徑 1->2->3 代表數字 123。
計算從根到葉子節點生成的所有數字之和。
說明: 葉子節點是指沒有子節點的節點。
示例 1: 輸入: [1,2,3] 1 / \ 2 3 輸出: 25 解釋: 從根到葉子節點路徑 1->2 代表數字 12. 從根到葉子節點路徑 1->3 代表數字 13. 因此,數字總和 = 12 + 13 = 25. 示例 2: 輸入: [4,9,0,5,1] 4 / \ 9 0 / \ 5 1 輸出: 1026 解釋: 從根到葉子節點路徑 4->9->5 代表數字 495. 從根到葉子節點路徑 4->9->1 代表數字 491. 從根到葉子節點路徑 4->0 代表數字 40. 因此,數字總和 = 495 + 491 + 40 = 1026.
dfs
-
確定遞迴函式返回值與函式引數
由於最後要得到根節點到所有葉子節點的數字之和所以返回int
;由於要進行遞迴,並記錄路徑上的數字所以函式引數為int traverse(TreeNode root, int pathVal)
-
確定遞迴退出條件
到達葉子節點後說明完成了一條路徑,這時返回這條路徑上數字組成的值 -
編寫單層邏輯
採用線序遍歷的方式記錄路徑上的數字
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public int sumNumbers(TreeNode root) { if (root == null) return 0; return traverse(root, 0); } private int traverse(TreeNode root, int pathVal) { if (root.left == null && root.right == null) { return pathVal * 10 + root.val; } pathVal = pathVal * 10 + root.val; int leftVal = 0; int rightVal = 0; if (root.left != null) leftVal = traverse(root.left, pathVal); if (root.right != null) rightVal = traverse (root.right, pathVal); return leftVal + rightVal; } }
bfs
維護兩個佇列一個佇列儲存節點,另一個佇列儲存每個節點對應的數字。
每次從佇列中取出一個節點:
- 如果該節點不是葉子節點則判斷該結點是否有左子節點與右子節點,將其子節點及對應的值加入佇列中。
- 如果取出的節點為葉子節點則將該節點對應的值進行累加。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public int sumNumbers(TreeNode root) { if (root == null) return 0; int sum = 0; Queue<TreeNode> queue = new LinkedList<>(); Queue<Integer> numQueue = new LinkedList<>(); queue.offer(root); numQueue.offer(root.val); while (!queue.isEmpty()) { TreeNode cur = queue.poll(); Integer pathVal = numQueue.poll(); if (cur.left == null && cur.right == null) { sum += pathVal; } if (cur.left != null){ queue.offer(cur.left); numQueue.offer(cur.left.val + pathVal * 10); } if (cur.right != null) { queue.offer(cur.right); numQueue.offer(cur.right.val + pathVal * 10); } } return sum; } }