【LeetCode每日一题】——129.求根到叶子节点数字之和

一【题目类别】

二【题目难度】

  • 中等

三【题目编号】

  • 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)

九【代码实现】

  1. 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);
    }

}
  1. 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);
}

/*主函数省略*/

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值