夯实算法-把二叉搜索树转换为累加树

125 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的31天,点击查看活动详情

题目:LeetCode

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

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

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

示例 1:

tree.png

输入: [4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出: [30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

示例 2:

输入: root = [0,null,1]
输出: [1,null,1]

示例 3:

输入: root = [1,0,2]
输出: [3,3,2]

示例 4:

输入: root = [3,2,4,1]
输出: [7,9,4,10]

提示:

  • 树中的节点数介于 0 和 10410^4 之间。
  • 每个节点的值介于 104-10^4 和 10410^4 之间。
  • 树中的所有值 互不相同 。
  • 给定的树为二叉搜索树。

解题思路

二叉搜索树的特点是左子节点值小于(或等于)根节点,根节点小于(或者等于)右子节点。 那么,如果按照中序(左,中,右)顺序遍历的话,得到的是会是一个从小到大排好序的列表。

题目要求,把一个节点值换成 大于或者 等 于此节点值的累加和,就是此节点右边的所有的节点值的累加和。 正常中序遍历,遍历到当前节点时,能知道 的是 小于此节点的所有节点的累加和,那么假如知道整个树所有节点之和,再 减去 到此遍历到此节点的累加和,结果就是大于等 于此节点的累加和。

以中序的逆序来遍历二叉搜索树,这个问题,只需要 遍历一遍 就可以解决

代码实现

class Solution {
    public TreeNode convertBST(TreeNode root) {
        int sum = 0;
        Stack < TreeNode > stack = new Stack < > ();
        TreeNode curr = root;
        while (curr != null || !stack.isEmpty()) {
            while (curr != null) {
                stack.push(curr);
                curr = curr.right;
            }

            TreeNode node = stack.pop();
            sum += node.val;
            node.val = sum;
            curr = node.left;
        }

        return root;
    }
}

运行结果

Snipaste_2022-12-29_22-22-25.png

复杂度分析

  • 空间复杂度:O(1)O(1)
  • 时间复杂度:O(n)O(n)

掘金(JUEJIN)  一起分享知识, Keep Learning!