代码随想录算法训练营第二十一天|669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树

二叉树专题做完了,递归(遍历)是二叉树结题的一大特点,递归算是掌握了,以后二刷的时候希望掌握迭代方法。

669. 修剪二叉搜索树

leetcode 669. 修剪二叉搜索树
代码随想录

如果一个节点小于low,那么将他的左边节点置为None,对右边节点进行递归的修建操作;同理大于high,右边置为None,对左边进行操作

class Solution:
    def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
        # 如果一个节点小于low,那么他的所有左边就都可以删除
        # 然后就需要对右边进行操作:
        if root == None:
            return root
        if low <= root.val <= high:
            root.left = self.trimBST(root.left, low, high)
            root.right = self.trimBST(root.right, low, high)
        elif root.val > high:
            root.right = None
            return self.trimBST(root.left, low, high)
        elif root.val < low:
            root.left = None
            return self.trimBST(root.right, low, high)
        return root

        

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

leetcode 108. 将有序数组转换为二叉搜索树
代码随想录

二分法,找中间,然后递归增加左右子树

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        # 二分法
        length = len(nums)
        # print(nums,length)
        # print(length == 1)
        if length == 0:
            return None
        elif length == 1:
            return TreeNode(nums[0])
        else:
            pricot = int(length/2)
            node = TreeNode(nums[pricot])
            node.left = self.sortedArrayToBST(nums[:pricot])
            node.right = self.sortedArrayToBST(nums[pricot + 1:])
            return node

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

leetcode 538. 把二叉搜索树转换为累加树
代码随想录

进行右中左的遍历,弄一个节点记录后序节点,当前节点的值等于后序节点的值+当前节点的值;然后将当前节点记录为新的后序节点。

class Solution:
    def __init__(self):
        self.new_post = None
    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        # 把标准的中序遍历改造 右中左
        # 使用一个后序节点,记录新节点的值,当前节点的新值等于后序节点的值+当前节点的值
        if root == None:
            return
        self.convertBST(root.right)
        if self.new_post != None:
            root.val = root.val + self.new_post.val
        self.new_post = root
        self.convertBST(root.left)
        return root
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值