Skip to content

代码随想录 二叉树:二叉搜索树转换为累加树

题目描述

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

提醒一下,二叉搜索树满足下列约束条件:

  • 节点的左子树仅包含键 小于 节点键的节点。
  • 节点的右子树仅包含键 大于 节点键的节点。
  • 左右子树也必须是二叉搜索树。

题目链接:538

文章讲解:538

思考

仔细阅读题目要求,其实就是将二叉搜索树以倒序从最后一个数开始累加,类似于后缀和,求这么一个新数组

所以以右中左这个遍历顺序遍历二叉树,右的值加到中节点上,在累加到左节点上。

因此需要使用一个pre指针指向右节点,随着遍历节点向左移而向左移。

递归三部曲

1、确定递归函数返回值和参数

给定二叉搜索树根节点,无返回值

2、终止条件

遇到空则返回

3、单层递归逻辑

右中左遍历二叉树,当前节点cur的数值就是cur->val + 前一个节点的数值,我们以pre来替代。累加完当前节点后还需要将pre往左移,使pre = cur

代码实现

C++
class Solution {
public:
    int pre = 0;
    void traversal(TreeNode* node) {
        if (node == nullptr)
            return;
        traversal(node->right);
        node->val += pre;
        pre = node->val;
        traversal(node->left);
    }

    TreeNode* convertBST(TreeNode* root) {
        traversal(root);
        return root;
    }
};