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

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

最笨的方法可以先求出所有的路徑,然後轉換成對應的數字,最後求和。但是時間效率很差(耗時3ms)

☆☆☆方法1:DFS

方法2:BFS

程式碼1:DFS(耗時0ms)

class Solution {
    public int sumNumbers(TreeNode root) {
        return dfs(root, 0);
    }
    // temp表示上一層所有節點的和
    private int dfs(TreeNode root, int temp) {
        if (root == null) return 0;
        int sum = 10 * temp + root.val;  //
當前節點的值就是父節點的值*10+當前節點的值 if (root.left == null && root.right == null) { return sum; } return dfs(root.left, sum) + dfs(root.right, sum); } }
class Solution {
    int sum;
    public int sumNumbers(TreeNode root) {
        dfs(root, 0);
        return sum;
    }
    
private void dfs(TreeNode root, int temp) { if (root == null) return; if (root.left == null && root.right == null) { sum += 10 * temp + root.val; } dfs(root.left, 10 * temp + root.val); dfs(root.right, 10 * temp + root.val); } }

程式碼2:BFS(耗時1ms)

class Solution {
    public int sumNumbers(TreeNode root) {
        int sum = 0;
        if (root == null) return sum;
        //維護兩個佇列,分別儲存節點和節點對應的數字。
        Queue<TreeNode> nodeQueue = new LinkedList<>();
        Queue<Integer> numQueue = new LinkedList<>();
        nodeQueue.offer(root);
        numQueue.offer(root.val);
        while (!nodeQueue.isEmpty()) {
            TreeNode cur = nodeQueue.poll();
            int num = numQueue.poll();

            if (cur.left == null && cur.right == null) {
                sum += num;
            }
            if (cur.left != null) {
                nodeQueue.offer(cur.left);
                numQueue.offer(num * 10 + cur.left.val);
            }
            if (cur.right != null) {
                nodeQueue.offer(cur.right);
                numQueue.offer(num * 10 + cur.right.val);
            }
        }
        return sum;
    }
}