给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:
例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字123
计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点
DFS和BFS都要会:
DFS就是递归解法.BFS稍微复杂一点但是其实很好理解,不过就是多加了一个队列用于同步
//递归解法 DFS
public static int sumNumbers(TreeNode root) {
return sumNumbers(root, 0);
}
//返回当前节点的总和 如果是null就返回0 不是null的话就往下进行递归
public static int sumNumbers(TreeNode root, int sum) {
if (root == null) return 0;
sum = sum * 10 + root.val;
if (root.left == null && root.right == null) {
return sum;
}
return sumNumbers(root.left, sum) + sumNumbers(root.right, sum);
}
非递归方法 BFS 具体的思路是整两个队列:这两个队列是同步的.一个用于存放节点,一个用于存放数值
当不是叶子结点的时候就将左右节点加进去 同时更新左右节点的数值
public static int sumNumbers2(TreeNode root) {
if (root == null) return 0;
Queue<TreeNode> nodeQueue = new LinkedList<>();
Queue<Integer> numsQueue = new LinkedList<>();
int ans = 0;
nodeQueue.offer(root);
numsQueue.offer(root.val);
while (!nodeQueue.isEmpty()) {
int size = nodeQueue.size();
for (int i = 0; i < size; i++) {
TreeNode node = nodeQueue.poll();
int num = numsQueue.poll();
//如果左右节点不为空的话 就将新的数值加进去
if (node.left != null) {
nodeQueue.offer(node.left);
numsQueue.offer(num * 10 + node.left.val);//就将新的数值加进去
}
if (node.right != null) {
nodeQueue.offer(node.right);
numsQueue.offer(num * 10 + node.right.val);//就将新的数值加进去
}
//如果是叶子结点的话 就可以将这个数值的结果加进去了
if (node.right == null && node.left == null) ans = ans + num;
}
}
return ans;
}