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;
    }
相关推荐
Zik----1 小时前
Leetcode35 —— 搜索插入位置(二分查找)
数据结构·算法·leetcode
Dovis(誓平步青云)1 小时前
《C/C+++ Boost 轻量级搜索引擎实战:架构流程、技术栈与工程落地指南——构造正/倒排索引(中篇)》
开发语言·c++·搜索引擎
yi.Ist1 小时前
牛客寒假训练营3
c++·学习·算法
24白菜头1 小时前
2026-2-23:LeetCode每日一题(动态规划专项)
笔记·学习·算法·leetcode·动态规划
小龙报2 小时前
【算法通关指南:数据结构与算法篇】二叉树相关算法题:1.美国血统 American Heritage 2.二叉树问题
c语言·数据结构·c++·算法·深度优先·广度优先·宽度优先
啊阿狸不会拉杆2 小时前
《计算机视觉:模型、学习和推理》第 9 章-分类模型
人工智能·python·学习·算法·机器学习·计算机视觉·分类
yyjtx2 小时前
DHU上机打卡D29
数据结构·c++·算法
多恩Stone2 小时前
【3D-AICG 系列-13】Trellis 2 的 SC-VAE 的 Training Loss 细节
人工智能·算法·3d·aigc
feng_you_ying_li2 小时前
类和对象(中)
c++