1. 程式人生 > 實用技巧 >[leetCode]129. 求根到葉子節點數字之和

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

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

  1. 確定遞迴函式返回值與函式引數
    由於最後要得到根節點到所有葉子節點的數字之和所以返回int;由於要進行遞迴,並記錄路徑上的數字所以函式引數為int traverse(TreeNode root, int pathVal)

  2. 確定遞迴退出條件
    到達葉子節點後說明完成了一條路徑,這時返回這條路徑上數字組成的值

  3. 編寫單層邏輯
    採用線序遍歷的方式記錄路徑上的數字

/**
 * 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;
    }
}