Featured image of post 538. 把二叉搜索树转换为累加树

538. 把二叉搜索树转换为累加树

题目描述

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

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

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

注意: 本题和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/ 相同

示例 1:

  • 输入:[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 和 104 之间。
  • 每个节点的值介于 -104 和 104 之间。
  • 树中的所有值 互不相同
  • 给定的树为二叉搜索树。

解法一:中序便利 + 后缀和

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
func convertBST(root *TreeNode) *TreeNode {
    if root == nil {
        // Prevent out of bounds error when performing
        // suffixSum[len(arr)-1] = arr[len(arr)-1] operation
        return root
    }
    var arr []int
    var inorder func(root *TreeNode)
    inorder = func(root *TreeNode) {
        if root == nil {
            return
        }
        inorder(root.Left)
        arr = append(arr, root.Val)
        inorder(root.Right)
    }
    inorder(root)

    // suffixSum[i] is the sum of arr[i...len(arr)-1]
    suffixSum := make([]int, len(arr))
    suffixSum[len(arr)-1] = arr[len(arr)-1]
    for i := len(arr) - 2; i >= 0; i-- {
        suffixSum[i] = suffixSum[i+1] + arr[i]
    }

    idx := 0
    var changeVal func(root *TreeNode)
    changeVal = func(root *TreeNode) {
        if root == nil {
            return
        }
        changeVal(root.Left)
        root.Val = suffixSum[idx]
        idx++
        changeVal(root.Right)
    }
    changeVal(root)
    return root
}

解法二:反序中序遍历

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func convertBST(root *TreeNode) *TreeNode {
    var sum int
    var revInorder func(root *TreeNode)
    revInorder = func(root *TreeNode) {
        if root == nil {
            return
        }
        revInorder(root.Right)
        sum += root.Val
        root.Val = sum
        revInorder(root.Left)
    }
    revInorder(root)
    return root
}
Licensed under CC BY-NC-SA 4.0
最后更新于 2023/05/07 20:06:02
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计