一【题目类别】
- 树
二【题目难度】
- 中等
三【题目编号】
- 129.求根到叶子节点数字之和
四【题目描述】
- 给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
- 每条从根节点到叶节点的路径都代表一个数字:
- 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。
- 计算从根节点到叶节点生成的 所有数字之和 。
- 叶节点 是指没有子节点的节点。
五【题目示例】
- 示例 1:
输入:root = [1,2,3]
输出:25
解释:
从根到叶子节点路径 1->2 代表数字 12
从根到叶子节点路径 1->3 代表数字 13
因此,数字总和 = 12 + 13 = 25 - 示例 2:
输入:root = [4,9,0,5,1]
输出:1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495
从根到叶子节点路径 4->9->1 代表数字 491
从根到叶子节点路径 4->0 代表数字 40
因此,数字总和 = 495 + 491 + 40 = 1026
六【题目提示】
- 树中节点的数目在范围 [1, 1000] 内
- 0 <= Node.val <= 9
- 树的深度不超过 10
七【解题思路】
- 使用递归,保存每一个节点的状态(就是当前节点值),如果是非叶子节点,继续向左或向右递归,并且将本节点的状态(当前节点值)传入到下一个递归,方便下一个节点计算到下一个节点的值,这里计算每次将传入的值10+当前节点值就是当前结点的状态值,如果遇到叶子节点,找到了一条路径,把之前路径的状态值10+当前节点值就是这条路径的值,以此类推递归即可
八【时间频度】
- 时间复杂度:因为需要遍历每个结点,所以时间复杂度为 O ( N ) O(N) O(N)
九【代码实现】
- Java语言版
package Tree;
public class p129_SumRootToLeafNumbers {
p129_SumRootToLeafNumbers left;
p129_SumRootToLeafNumbers right;
int val;
p129_SumRootToLeafNumbers(int val) {
this.val = val;
}
public p129_SumRootToLeafNumbers() {
}
public static void main(String[] args) {
// 初始化各个节点
p129_SumRootToLeafNumbers root = new p129_SumRootToLeafNumbers(1);
p129_SumRootToLeafNumbers left = new p129_SumRootToLeafNumbers(2);
p129_SumRootToLeafNumbers right = new p129_SumRootToLeafNumbers(3);
// 生成这棵树
root.left = left;
root.right = right;
p129_SumRootToLeafNumbers p129_sumRootToLeafNumbers = new p129_SumRootToLeafNumbers();
int res = p129_sumRootToLeafNumbers.sumNumbers(root);
System.out.println("res = " + res);
}
public int sumNumbers(p129_SumRootToLeafNumbers root) {
return getSum(root, 0);
}
public int getSum(p129_SumRootToLeafNumbers root, int sum) {
if (root == null) {
return 0;
}
// 临时变量
int temp = sum * 10 + root.val;
// 叶子节点
if (root.left == null && root.right == null) {
return temp;
}
return getSum(root.left, temp) + getSum(root.right, temp);
}
}
- C语言版
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*树的结构体*/
struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
};
int p129_SumRootToLeafNumbers_getRes(struct TreeNode* root, int sum)
{
/*空结点直接返回0*/
if (root == NULL)
{
return 0;
}
/*如果是叶子结点那么就意味着找到了一条路径,将之前路径的状态值*10+当前结点值就是这条路径的值*/
if (root->left == NULL && root->right == NULL)
{
return sum * 10 + root->val;
}
/*如果是非叶子结点继续向左右递归,传入当前路径的状态值,方便下一个结点递归相加计算新的路径的状态值,最后递归结束就是左子树和右子树的值,相加就是结果*/
return p129_SumRootToLeafNumbers_getRes(root->left, sum * 10 + root->val) + p129_SumRootToLeafNumbers_getRes(root->right, sum * 10 + root->val);
}
int sumNumbers(struct TreeNode* root)
{
return p129_SumRootToLeafNumbers_getRes(root, 0);
}
/*主函数省略*/
十【提交结果】
-
Java语言版
-
C语言版