代码随想录算法训练营第二十三天(二叉树篇)|669. 修剪二叉搜索树,108. 将有序数组转化为二叉搜索树,528. 把二叉搜索树转换为累加树

今天花时间把之前28.字符串第一个匹配项那道题通过例子补充了KMP算法的思路,虽然自认为搞懂了,但用文字和图画阐释出来让其他人(甚至以后的自己)理解感觉并不简单,必须要一遍遍理清思路和组织语言,现在仍然做得不够,会继续努力的。代码随想录算法训练营第十天|28. 找出字符串第一个匹配项的下标,459.重复的子字符串-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Huiwen18/article/details/134563188?spm=1001.2014.3001.5501

669. 修剪二叉搜索树 

题目链接:669. 修剪二叉搜索树 - 力扣(LeetCode)

思路

这道题的过程没有之前删除二叉搜索树的节点那么繁琐,因为我们不需要分开讨论要删除(修剪)节点的左右子树的存在情况——只要当前节点小于最小值,由于二叉搜索树的有序性,它的左节点肯定更小于最小值,因此只需把当前节点的右子树进入递归,把结果向上返回即可。同理,若当前节点大于最大值,只需把当前节点的左子树放入递归,把结果向上返回。我们使用前序遍历的顺序遍历二叉搜索树。当遍历到在区间外的节点时,进行上述操作。

代码实现

class Solution(object):
    def trimBST(self, root, low, high):
        if not root:
            return None
        if root.val < low:
            right = self.trimBST(root.right, low, high)
            return right
        if root.val > high:
            left = self.trimBST(root.left, low, high)
            return left
        root.left = self.trimBST(root.left, low, high)
        root.right = self.trimBST(root.right, low, high)
        
        return root

108. 将有序数组转化为二叉搜索树

题目链接:108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)

思路

本题和之前关于构造二叉树的题目思路差不多,为了让所构造的二叉树是高度平衡二叉树(满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树),我们每次二叉树的根节点的值设为数组中间的数,然后将根节点左右两部分分别进入递归,返回给当前节点的左右子树。

代码实现

class Solution(object):
    def sortedArrayToBST(self, nums):
        if nums == []:
            return None
        root_idx = len(nums)//2
        root_val = nums[root_idx]
        left = nums[:root_idx]
        right = nums[root_idx+1:len(nums)]
        root = TreeNode(root_val)
        root.left = self.sortedArrayToBST(left)
        root.right = self.sortedArrayToBST(right)

        return root

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

题目链接:538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)

思路

二叉搜索树的右下方的节点值一定是最大的,所以我们要用”右中左“的次序遍历二叉搜索树,把当前节点的值加上上一个节点的值,得到当前节点的累加值。

代码实现

class Solution(object):
    def traversal(self, root):
        if not root:
            return None
        if root.right:
            self.traversal(root.right)

        if self.pre:
            root.val += self.pre.val
        self.pre = root
        
        if root.left:
            self.traversal(root.left)
        return root

    def convertBST(self, root):
        self.pre = None
        return self.traversal(root)

你可能感兴趣的:(代码随想录训练营,算法,数据结构,python)