Skip to content

Latest commit

 

History

History
93 lines (77 loc) · 2.51 KB

File metadata and controls

93 lines (77 loc) · 2.51 KB

题目简述:

给你一个二叉树的根节点 root ,树中每个节点都存放有一个 09 之间的数字。

每条从根节点到叶节点的路径都代表一个数字:

  • 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123

计算从根节点到叶节点生成的 所有数字之和

叶节点 是指没有子节点的节点。

题目链接:129. 求根节点到叶节点数字之和

DFS递归前序遍历

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */


class Solution {
    int sumTotal;

    public int sumNumbers(TreeNode root) {
        sumTotal = 0;
        dfs(root, 0);
        return sumTotal;
    }

    public void dfs(TreeNode root, int sum) {
        if (root == null) return;
        sum = sum * 10 + root.val;
        
        if (root.left == null && root.right == null) {
            sumTotal += sum;
            return;
        }
        
        dfs(root.left, sum);
        dfs(root.right, sum);
    }
}

BFS非递归层序遍历

非递归的迭代BFS层序遍历写法关键是使用两个队列,一个保存遍历节点、一个保存sum值,这样会方便许多。或者,使用一个队列存储Object数组,每个数组同时存储节点和sum值,也是可以的。

class Solution {
    public int sumNumbers(TreeNode root) {
        Deque<TreeNode> nodeQueue = new ArrayDeque<>();
        Deque<Integer> sumQueue = new ArrayDeque<>();
        nodeQueue.add(root);
        sumQueue.add(root.val);
        int sumTotal = 0;

        while (!nodeQueue.isEmpty()) {
            TreeNode node = nodeQueue.poll();
            int sum = sumQueue.poll();

            if (node.left == null && node.right == null) {
                sumTotal += sum;
            } else {
                if (node.left != null) {
                    nodeQueue.add(node.left);
                    sumQueue.add(sum * 10 + node.left.val);
                }
                if (node.right != null) {
                    nodeQueue.add(node.right);
                    sumQueue.add(sum * 10 + node.right.val);
                }
            }
        }

        return sumTotal;
    }
}