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


一、题目描述

给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。

例如:

输入: 原始二叉搜索树:
              5
            /   \
           2     13

输出: 转换为累加树:
             18
            /   \
          20     13

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/convert-bst-to-greater-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路

  • 因为是二叉搜索树,所以节点值的大小顺序为左 < 根 < 右
  • 大小顺序像极了中序遍历2 5 13
  • 就以题目中的二叉搜索树为例,右子树的值13不变,根的值等于5+13=18。左子树节点的值为13+5+2=20,更进一步就是18+2=20。
  • 所以中序遍历逆向依次累加,便是结果。

三、代码实现

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def convertBST(self, root: TreeNode) -> TreeNode:
        '''中序遍历,逆序'''

        def recursion(root):
            nonlocal sums
            if root:
                recursion(root.right)
                sums += root.val
                root.val = sums
                recursion(root.left)

        sums = 0
        recursion(root)

        return root

四、表现

运行时间 击败 内存消耗 击败
88ms 37.41% 15.5MB 47.41%

文章作者: Arvin He
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Arvin He !
评论
 上一篇
617. 合并二叉树 617. 合并二叉树
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
2020-09-23
下一篇 
78. 子集 78. 子集
一、题目描述给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 输入:nums = [1, 2, 3] 输出: [ [3],   [1],   [2]
2020-09-20
  目录