【力扣日记】538把二叉搜索树转换为累加树 | 二叉树的反向中序遍历 | 递归

题目描述

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

例如:

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

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

算法思路

二叉树果然天然适合递归。并且找到思路以后递归的书写就很简单。
再次重申一句,二叉搜索树的中序遍历即是递增数组。

所以很容易想到反向的中序遍历,就可以从大到小遍历一遍树。

NAIVE

class Solution:
    SUM=0
    def convertBST(self, root: TreeNode) -> TreeNode:
        def BST(root):
            if not root:return 
            self.convertBST(root.right)
            tmp=root.val
            root.val+=self.SUM
            self.SUM+=tmp
            self.convertBST(root.left)
        BST(root)
        return root

这里要提的是,其实满侥幸的,题目没有明确要求二叉搜索树没有重复值,如果有重复值,算法就是不完全的。

IMPROVE

来一点小优化。

class Solution:
    SUM=0
    def convertBST(self, root: TreeNode) -> TreeNode:
        if not root:return 
        self.convertBST(root.right)
        root.val+=self.SUM
        self.SUM=root.val
        self.convertBST(root.left)
        return root

1、去掉了内嵌函数。本来添加内嵌函数是因为我傻 了,(其实还是因为递归原理不熟练),想着要返回根节点,于是把递归调用放在了内嵌函数里完成。写完了才想到貌似在每一层最后返回root即可,最后栈回溯最后一层就是根节点。

2、用类属性SUM来保存累加和,多余增加了一个tmp变量,看评论区才注意到其实每个节点的值就是当前的累加和。

发布了210 篇原创文章 · 获赞 20 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Heart_for_Ling/article/details/104676236