题目描述
给定一个仅包含数字0-9的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。
例如根节点到叶子节点的一条路径是 1→2→3,那么这条路径就用 123 来代替。
找出根节点到叶子节点的所有路径表示的数字之和
例如:
这颗二叉树一共有两条路径,根节点到叶子节点的路径 1→2 用数字 12 代替,根节点到叶子节点的路径 1→3 用数字 13 代替
所以答案为 12+13=25
示例1
输入:{1,0}
返回值:10
题目分析
想要获得所有的路径和,首先使用 dfs深度遍历(先序) 来遍历整个树,当遍历到叶子结点时,可说明遍历完一条路径,统计这条路径的结点和,最后将每条路径的和相加即为结果。
解题思路
方法1:使用字符串记录所有路径,最后相加
①定义全局变量sum,统计所有路径和
②使用StringBuilder记录路径上经过的结点,path.append(node.val);
②将字符串转化为路径值,Integer.parseInt(path.toString()) 加到sum中;
方法2:计算每个结点到叶子结点的路径和,最后获得根结点的值
①遍历整个树,当前结点的路径和 = 左子节点和 + 右子节点和;
②每个结点的路径和sum需要移位, sum = sum * 10 + root.val;
③最后返回的是所有路径和。
代码实现
方法1:使用字符串记录所有路径,最后相加
// 静态变量记录所有路径和
public static int sum = 0;
public int sumNumbers (TreeNode root) {
// write code here
if(root == null) return 0;
backtrack(root, new StringBuilder());
return sum;
}
public void backtrack(TreeNode root, StringBuilder path){
// 到空结点返回
if(root == null) return ;
// 使用stringBuilder记录路径上叶子结点的数值
path.append(root.val);
if(root.left == null && root.right == null){
// 到叶子结点为一条路径,将字符串转为数值
int num = Integer.parseInt(path.toString());
// 加入总和
sum += num;
}
// 先序遍历整个树
backtrack(root.left, path);
backtrack(root.right, path);
// 回退当前结点,字符串减少一个数
path.deleteCharAt(path.length()-1);
}时间复杂度:O(n),n是树的结点数,需要遍历整个树,时间复杂度为O(n);
空间复杂度:O(n),递归深度最大为n,空间复杂度为O(n);
方法2:计算每个结点到叶子结点的路径和,最后获得根结点的值
public int sumNumbers (TreeNode root) {
// write code here
if(root == null) return 0;
return backtrack(root, 0);
}
public int backtrack(TreeNode root, int sum){
if(root == null) return 0;
// 加入当前结点的值
sum = sum * 10 + root.val;
if(root.left == null && root.right == null){
// 到叶子结点返回计算的值
return sum;
}
// 未到叶子结点,则往左右子节点继续计算和
return backtrack(root.left, sum) + backtrack(root.right, sum);
}时间复杂度:O(n),n是树的结点数,需要遍历整个树,时间复杂度为O(n);
空间复杂度:O(n),递归深度最大为n,空间复杂度为O(n);

京公网安备 11010502036488号