力扣(LeetCode)1038. 从二叉搜索树到更大和树(C++)

文章讲解如何将BST转换为每个节点值为大于等于自身所有节点和的GST,使用反向先序遍历和前缀和。
先序遍历

根据题意,给定一个二叉搜索树 root (BST),请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。模拟二叉搜索树替换到更大和数的过程,

请了解性质:二叉搜索树的先序遍历,是一个正序数组
直观思路,先序遍历(左根右)得到正序数组,再反向先序遍历(右根左)二叉搜索树,根据正序数组倒着累加在树上。

请思考:反向先序遍历(右根左)二叉搜索树的结果,正是二叉搜索树的逆序数组,提示我们可以直接反向先序遍历遍历二叉搜索树,同时累加。

提示:累加的过程,是对二叉搜索树的逆序数组,做前缀和。

class Solution {
private:
    int sum = 0;
public:
    TreeNode* bstToGst(TreeNode* root) {
        preOrderTraverse(root);
        return root;
    }
    void preOrderTraverse(TreeNode *t_node) {
        if (!t_node) return ;
        if (t_node -> right) preOrderTraverse(t_node->right);
        sum += t_node->val;
        t_node->val = sum;
        if (t_node -> left) preOrderTraverse(t_node->left);
    }
};

时间复杂度 O(n)O(n)O(n):反向先序遍历的时间复杂度O(n)O(n)O(n)
空间复杂度 O(n)O(n)O(n):最坏空间复杂度O(n)O(n)O(n)

致语
  • 欢迎读者在评论区留言,期待和大家交流做题感想,分享算法经验~
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清墨韵染

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值