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

思路

最好想到的就是暴力,一个节点遍历一次树,每次在遍历的过程中累加出值原树中大于或等于当前节点(当然也算当前节点喽)的值之和。

时间:O(n²)

再稍微优化一点,之遍历一次树,把值存在数组里,遍历数组求和,但要遍历n次数组,时间还是O(n²)。

我则没有用这个方法。

我运气比较好,滚轮滚多了,直接看到了下面的图免疫了忽悠。那看图找规律,不就是右中左遍历经过的点求和么......于是,我那中序遍历模板改了几行,一交。AC了?!

用时击败100.00% 内存击败20.25%

那为什么这样能对呢?

这不是普通二叉树,是二叉搜索树!

这意味着,如果中序遍历二叉搜索树遍历过的节点依次存在一个数组里,数组就是升序的,原树中大于或等于当前结点值的节点的值之和就是数组中当前节点及更靠后的节点值之和。那这个数组是中序遍历(左中右)得到的,为升序,那反向中序遍历(右中左)经过的结点就是降序。这样,我们就可以在反向中序遍历过程中用一个变量求和,把每个经过的节点的值赋为当前变量的值,遍历后的数就是累加树了。

这样时间复杂度就为O(n)了。

代码

cpp 复制代码
class Solution {
public:
    int s;
    int dg(TreeNode* a) {
        if(!a) {
            return 0;
        }
        dg(a->right);
        s+=a->val;
        a->val=s;
        dg(a->left);
        return 0;
    }
    TreeNode* convertBST(TreeNode* r) {
        dg(r);
        return r;
    }
相关推荐
8Qi811 小时前
LeetCode 115 & 392:不同子序列 / 判断子序列
算法·leetcode·职场和发展·动态规划
枕星而眠11 小时前
C++ 面向对象核心机制深度解析:多态性、虚函数、虚继承与 final 类
运维·开发语言·c++·后端
小蒋学算法11 小时前
算法-乘法表中第K小的数-二分
数据结构·算法
智者知已应修善业11 小时前
【51单片机8个LED,已经使用了D1D2,怎么样在不动D1D2的前提下实现D6~D8的流水灯】2024-1-19
c++·经验分享·笔记·算法·51单片机
Evand J11 小时前
【MATLAB例程】自适应渐消扩展卡尔曼滤波(AFEKF)三维雷达目标跟踪|效果已调优,附下载链接和运行结果,代码直接运行即可
开发语言·算法·matlab·目标跟踪·卡尔曼滤波·自适应滤波·代码定制
坚果派·白晓明11 小时前
鸿蒙PC适配实战:simdjson 三方库移植攻略与 AtomCode Skills 提效之道
c++·harmonyos·三方库·skills·atomcode·c/c++三方库·c/c++三方库适配
爱装代码的小瓶子11 小时前
3. 设计buffer模块
linux·服务器·开发语言·c++·php
郝学胜-神的一滴11 小时前
Qt 高级开发 027: QTabWidget自定义样式表美化实战
开发语言·c++·qt·程序人生·软件构建·用户界面
双河子思11 小时前
《代码整洁之道》——读书笔记(持续更新)
开发语言·c++·c#
圣保罗的大教堂11 小时前
leetcode 2161. 根据给定数字划分数组 中等
leetcode