题目介绍
力扣129题:leetcode-cn.com/problems/su…
方法一
利用二叉树前序遍历,遍历的过程中累加节点值,计算完根节点之后进行回溯,代码如下:
class Solution {
private int result = 0;
private StringBuilder temp = new StringBuilder();
public int sumNumbers(TreeNode root) {
if(root == null) {
return 0;
}
traverseNumbers(root);
return result;
}
public void traverseNumbers(TreeNode root) {
if(root == null) {
return;
}
temp.append(root.val + "");
if(root.left == null && root.right == null) {
result += Integer.valueOf(String.valueOf(temp));
}
traverseNumbers(root.left);
traverseNumbers(root.right);
//相当于回溯
temp.deleteCharAt(temp.length() - 1);
}
}
方法二:深度优先搜索
深度优先搜索是很直观的做法。从根节点开始,遍历每个节点,如果遇到叶子节点,则将叶子节点对应的数字加到数字之和。如果当前节点不是叶子节点,则计算其子节点对应的数字,然后对子节点递归遍历。
代码如下:
class Solution {
public int sumNumbers(TreeNode root) {
return dfs(root, 0);
}
public int dfs(TreeNode root, int prevSum) {
if (root == null) {
return 0;
}
int sum = prevSum * 10 + root.val;
if (root.left == null && root.right == null) {
return sum;
} else {
return dfs(root.left, sum) + dfs(root.right, sum);
}
}
}
复杂度分析
-
时间复杂度:O(n),其中 nn 是二叉树的节点个数。对每个节点访问一次。
-
空间复杂度:O(n),其中 nn 是二叉树的节点个数。空间复杂度主要取决于递归调用的栈空间,递归栈的深度等于二叉树的高度,最坏情况下,二叉树的高度等于节点个数,空间复杂度为 O(n)。