C++ LeetCode0538二叉搜索树转换累加树示例

 更新时间:2022年12月16日 15:31:53   作者:LetMeFly  
这篇文章主要为大家介绍了C++ LeetCode0538二叉搜索树转换累加树示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

LeetCode 538把二叉搜索树转换为累加树

力扣题目链接:leetcode.cn/problems/co…

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

提醒一下,二叉搜索树满足下列约束条件:

  • 节点的左子树仅包含键 小于 节点键的节点。
  • 节点的右子树仅包含键 大于 节点键的节点。
  • 左右子树也必须是二叉搜索树。

注意:本题和 1038: leetcode-cn.com/problems/bi… 相同

示例 1:

输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

示例 2:

输入:root = [0,null,1]
输出:[1,null,1]

示例 3:

输入:root = [1,0,2]
输出:[3,3,2]

示例 4:

输入:root = [3,2,4,1]
输出:[7,9,4,10]

提示:

方法一:DFS反向中序遍历

二叉搜索树有一个非常不错的性质,就是“中序遍历所经过的节点的值是非递减的”。

同理,如果我们“反向中序遍历(右子->根->左子)”一颗二叉搜索树,那么我们的遍历顺序就是“非递增”的。

我们只需要记录一下“历史遍历节点的总和”,然后按照反向中序遍历的方式去遍历这棵二叉树,遍历到某个节点时,将这个节点的值修改为“这个节点的初始值 和 历史节点总和 的 和”,同时更新“历史遍历节点的总和”即可。

  • 时间复杂度O(n),其中nnn是二叉树节点的个数
  • 空间复杂度O(n)

AC代码

C++

class Solution {
private:
    int total;
    void dfs(TreeNode* root) {
        if (!root)
            return;
        dfs(root->right);
        total = root->val = total + root->val;
        dfs(root->left);
    }
public:
    Solution() {total = 0;}
    TreeNode* convertBST(TreeNode* root) {
        dfs(root);
        return root;
    }
};

至于更高级的O(1)空间复杂度实现中序遍历的方法,请参考官方题解

以上就是C++ LeetCode0538二叉搜索树转换累加树示例的详细内容,更多关于C++ 二叉搜索树转换累加树的资料请关注脚本之家其它相关文章!

相关文章

  • C++中继承与多态的基础虚函数类详解

    C++中继承与多态的基础虚函数类详解

    这篇文章主要给大家介绍了关于C++中继承与多态的基础虚函数类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • C++无try-catch的异常捕获示例详解

    C++无try-catch的异常捕获示例详解

    这篇文章主要为大家介绍了C++无try-catch的异常捕获示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • C语言实例讲解选择语句的使用

    C语言实例讲解选择语句的使用

    选择语句是C语言中的重要组成部分,该部分也比较基础,本文将通过最通俗易懂的方式来为大家做出讲解。相信通过本文的学习,让大家一举拿下C语言选择语句的知识点
    2022-05-05
  • C语言中的setlinebuf()、utmpname()、rewind函数使用

    C语言中的setlinebuf()、utmpname()、rewind函数使用

    这篇文章主要介绍了C语言中的setlinebuf()、utmpname()、rewind函数使用,是C语言中操作文件的一些基本函数,需要的朋友可以参考下
    2015-08-08
  • C程序中Ubuntu、stm32的内存分配问题

    C程序中Ubuntu、stm32的内存分配问题

    这篇文章主要介绍了C程序中Ubuntu、stm32的内存分配问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • C语言实现选择排序、直接插入排序、冒泡排序的示例

    C语言实现选择排序、直接插入排序、冒泡排序的示例

    这篇文章主要介绍了C++实现选择排序、直接插入排序、冒泡排序的代码示例,相当简洁直观,也是算法和数据结构学习中的基础,需要的朋友可以参考下
    2016-02-02
  • C++简明分析讲解布尔类型及引用

    C++简明分析讲解布尔类型及引用

    布尔型(Boolean),是一种类型变量类型,引用(reference)就是C++对C语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样
    2022-04-04
  • C++中push_back()函数的具体使用

    C++中push_back()函数的具体使用

    本文主要介绍了C++中push_back()函数的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • 浅析C++中的重载,隐藏和覆盖

    浅析C++中的重载,隐藏和覆盖

    在C++语言中,函数扮演着很重要的角色,不管面向过程设计,还是基于对象设计。本文主要为大家介绍了函数中重载、覆盖和隐藏的相关知识,感兴趣的小伙伴可以了解一下
    2022-12-12
  • C++ ffmpeg实现将视频帧转换成jpg或png等图片

    C++ ffmpeg实现将视频帧转换成jpg或png等图片

    有时播放实时流的时候有截图的需求,需要将解码出来的图片保存本地或上传服务器,这时就需要将avframe中的数据编码成png、jpg等格式的图片,我们使用ffmpeg的相关编码器就可以实现功能,下面就来讲讲具体实现方法吧
    2023-03-03

最新评论