LeetCode 129 求根到叶子节点数字之和 题解
作者:互联网
LeetCode 129 求根到叶子节点数字之和 题解
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/
例如,从根到叶子节点路径 1->2->3 代表数字 123。
计算从根到叶子节点生成的所有数字之和。
说明: 叶子节点是指没有子节点的节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 25
解释:
从根到叶子节点路径 1->2 代表数字 12.
从根到叶子节点路径 1->3 代表数字 13.
因此,数字总和 = 12 + 13 = 25.
方法:
1.递归 dfs
注意观察规律,计算的时候,根节点到当前结点所组成的数字是根节点到上一个结点组成的数字*10+当前节点的值
时间复杂度:O(n)
,其中 n 是二叉树的节点个数。对每个节点访问一次。
空间复杂度:O(n)
,其中 n 是二叉树的节点个数。空间复杂度主要取决于递归调用的栈空间,递归栈的深度等于二叉树的高度,最坏情况下,二叉树的高度等于节点个数,空间复杂度为 O(n)。
class Solution {
public int sumNumbers(TreeNode root) {
return helper(root, 0);
}
//i为root之前的路径构成的数值的大小,比如1-2-3,root=3时,i=12
public int helper(TreeNode root, int i){
if (root == null) return 0;
int temp = i * 10 + root.val;
//递归的出口是叶子结点
if (root.left == null && root.right == null)
return temp;
return helper(root.left, temp) + helper(root.right, temp);
}
}
2. bfs
class Solution {
public int sumNumbers(TreeNode root) {
if (root == null) {
return 0;
}
int sum = 0;
Queue<TreeNode> nodeQueue = new LinkedList<TreeNode>();
Queue<Integer> numQueue = new LinkedList<Integer>();
nodeQueue.offer(root);
numQueue.offer(root.val);
while (!nodeQueue.isEmpty()) {
TreeNode node = nodeQueue.poll();
int num = numQueue.poll();
TreeNode left = node.left, right = node.right;
if (left == null && right == null) {
sum += num;
} else {
if (left != null) {
nodeQueue.offer(left);
numQueue.offer(num * 10 + left.val);
}
if (right != null) {
nodeQueue.offer(right);
numQueue.offer(num * 10 + right.val);
}
}
}
return sum;
}
}
标签:right,int,题解,节点,LeetCode,null,root,求根,left 来源: https://blog.csdn.net/qq_39618369/article/details/120784265