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;
    }
}
原文地址:https://www.cnblogs.com/HuangYJ/p/14180983.html