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;
    }
相关推荐
t***5446 分钟前
如何在Dev-C++中配置Clang编译器
开发语言·c++
t***54413 分钟前
Dev-C++ 中使用 Clang 调试有哪些常见问题
开发语言·c++
itzixiao19 分钟前
L1-058 6翻了(15分)[java][python]
java·开发语言·python·算法
念何架构之路20 分钟前
数组和切片实战
数据结构·算法·排序算法
重生之我是Java开发战士22 分钟前
【数据结构】AVL树解析
数据结构·算法
珹洺25 分钟前
C++AI多模型聊天系统(四)SSH反向隧道/虚拟局域网(VLAN)调用本地Ollama大模型
c++·人工智能·ssh
小π军25 分钟前
STL之multiset 常见API介绍
数据结构·c++·算法
踩坑记录26 分钟前
leetcode hot100 1143. 最长公共子序列 mediuim 递归优化
leetcode
研究点啥好呢27 分钟前
Momenta算法工程师面试题精选:10道高频考题+答案解析
人工智能·算法·求职招聘·面试笔试
Resistance丶未来27 分钟前
DeepSeek-V4 新手快速上手指南
数据结构·python·gpt·算法·机器学习·claude·claude 4.6