LC.538 | 把二叉搜索树转换为累加树 | 树 | 逆向中序遍历(右-根-左)

输入: 二叉搜索树根节点 root(节点值各不相同)。

要求: 将其转换为累加树(Greater Sum Tree):
每个节点的新值 = 原树中所有 大于等于该节点值 的节点值之和。

输出: 转换后的树根节点 TreeNode*(原地修改后返回 root)。


思路:

BST 的中序遍历(左-根-右)是递增序列。
那我们如果想做“后缀和”(从大到小累加),就把遍历方向反过来:

逆向中序遍历:右 -> 根 -> 左
访问顺序从大到小,维护一个滚动累加 sum

遍历到某个节点时:

  1. 先走右子树(更大的值先处理)
  2. sum += node->val
  3. node->val = sum(把当前节点改成“>= 自己的总和”)
  4. 再走左子树

补充:
也能用“两次正序中序”做:第一次中序存有序数组并做后缀和映射,第二次再中序回填。
但那是 O(N) 额外空间;本题一趟逆向中序就能原地搞定。


复杂度:

  • 时间复杂度:O(N)
  • 空间复杂度:O(H)(递归栈,H 为树高)

class Solution {
public:
    TreeNode* convertBST(TreeNode* root) {
        sum = 0;
        reverseInorder(root);
        return root;
    }

private:
    int sum;

    void reverseInorder(TreeNode* node) {
        if (node == nullptr) return;

        reverseInorder(node->right);

        sum += node->val;
        node->val = sum;

        reverseInorder(node->left);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值