C++求根节点到叶子节点数字之和

简介: C++求根节点到叶子节点数字之和

C++求根节点到叶子节点数字之和

📟作者主页:慢热的陕西人

🌴专栏链接:力扣刷题日记

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言


题目链接

LCR 049. 求根节点到叶节点数字之和 - 力扣(LeetCode)

题目描述

给定一个二叉树的根节点 root ,树中每个节点都存放有一个 09 之间的数字。

每条从根节点到叶节点的路径都代表一个数字:

  • 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123

计算从根节点到叶节点生成的 所有数字之和

叶节点 是指没有子节点的节点。

解题思路

其实对于这种二叉树类的题目,并且又提到根节点--->叶节点,我们应该很容易想到dfs.

所以我们尝试用dfs来解答这道题目

①截止条件

截止条件就是当我们遇到叶子节点的时候我们只需要返回之前路径的值 * 10 + 当前节点的值

②中间过程

我们坚信dfs(TreeNode* root, int presum)这个函数可以将root中的值算出来;

所以对于一个中间节点,我们只需要:

int ret = 0;
        if(root->left)
        ret += dfs(root->left, presum);
        if(root->right)
        ret += dfs(root->right, presum);
        return ret;

至此我们解题思路就到此为止

代码

class Solution {
public:
    int sumNumbers(TreeNode* root) 
    {
        return dfs(root, 0);
    }
    int dfs(TreeNode* root, int presum)
    {
        presum = presum * 10 + root->val;
        if(root->left == nullptr && root->right == nullptr)
        {
            return presum;
        }
        int ret = 0;
        if(root->left)
        ret += dfs(root->left, presum);
        if(root->right)
        ret += dfs(root->right, presum);
        return ret;
    }
};

复杂度分析

时间复杂度:

相当于深度优先遍历了二叉树,所以时间复杂度就是O(N);

空间复杂度:

额外使用了常数个变量所以空间复杂度是O(1);

相关文章
|
6月前
|
存储 算法 编译器
【C/C++ 数据结构 线性表】 数据结构 解析 链表中哨兵节点(伪节点)的作用
【C/C++ 数据结构 线性表】 数据结构 解析 链表中哨兵节点(伪节点)的作用
101 0
|
6月前
|
Java C++ Python
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-456 求链表各节点的平均值(C++解法)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-456 求链表各节点的平均值(C++解法)
53 0
剑指offer(C++)-JZ54:二叉搜索数的第k个节点(数据结构-树)
剑指offer(C++)-JZ54:二叉搜索数的第k个节点(数据结构-树)
剑指offer(C++)-JZ54:二叉搜索数的第k个节点(数据结构-树)
C++递归解决两两交换链表中节点
C++递归解决两两交换链表中节点
|
算法 C++
剑指offer(C++)-JZ86:在二叉树中找到两个节点的最近公共祖先(数据结构-树)
剑指offer(C++)-JZ86:在二叉树中找到两个节点的最近公共祖先(数据结构-树)
剑指offer(C++)-JZ18:删除链表的节点(数据结构-链表)
剑指offer(C++)-JZ18:删除链表的节点(数据结构-链表)
|
Rust 算法 安全
【算法学习】剑指 Offer II 054. 所有大于等于节点的值之和|538|1038(java / c / c++ / python / go / rust)
给定一个二叉搜索树,请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 提醒一下,二叉搜索树满足下列约束条件: 节点的左子树仅包含键 小于 节点键的节点。 节点的右子树仅包含键 大于 节点键的节点。 左右子树也必须是二叉搜索树。
【算法学习】剑指 Offer II 054. 所有大于等于节点的值之和|538|1038(java / c / c++ / python / go / rust)
|
Rust 算法 安全
【算法学习】237. 删除链表中的节点(java / c / c++ / python / go / rust)
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。
【算法学习】237. 删除链表中的节点(java / c / c++ / python / go / rust)
|
Rust 算法 安全
【算法学习】02.03. 删除中间节点(java / c / c++ / python / go / rust)
若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。 假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。 例如,传入节点 c(位于单向链表 a->b->c->d->e->f 中),将其删除后,剩余链表为 a->b->d->e->f
【算法学习】02.03. 删除中间节点(java / c / c++ / python / go / rust)
|
C++
剑指offer之C++语言实现链表(两种删除节点方式)
剑指offer之C++语言实现链表(两种删除节点方式)
154 0