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;
    }
相关推荐
csdn_aspnet4 小时前
C语言 Lomuto分区算法(Lomuto Partition Algorithm)
c语言·开发语言·算法
谙弆悕博士4 小时前
【附C源码】从零实现C语言堆数据结构:原理、实现与应用
c语言·数据结构·算法··数据结构与算法
C+++Python6 小时前
C++ 进阶学习完整指南
java·c++·学习
sparEE6 小时前
c++值类别、右值引用和移动语义
开发语言·c++
jrrz08287 小时前
Apollo MPC Controller
c++·自动驾驶·apollo·mpc·横向控制·lateral control
gaosushexiangji7 小时前
DIC系统推荐:基于千眼狼三维数字图像相关的无人机旋翼疲劳试验全场应变与位移测量
人工智能·算法
小王C语言9 小时前
【线程概念与控制】:线程封装
jvm·c++·算法
圣保罗的大教堂9 小时前
leetcode 796. 旋转字符串 简单
leetcode
学习,学习,在学习9 小时前
Qt工控仪器程序框架设计详解(工控多仪器控制版本)
开发语言·c++·qt
kyle~9 小时前
工程数学---点云配准卡布施(Kabsch)算法(求解最优旋转矩阵)
线性代数·算法·矩阵