题目描述
给定一个仅包含数字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);