代码随想录算法训练营Day23 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、二叉树总结 | Python | 个人记录向

文章介绍了如何使用递归和迭代方法修剪二叉搜索树,以及将有序数组转换为二叉搜索树和二叉搜索树转换为累加树的过程。作者分享了个人在解决这些问题时的心得体会,强调了理解搜索树特性和遍历的重要性。
摘要由CSDN通过智能技术生成

669. 修剪二叉搜索树

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

做题

一个节点不在区间内,但它的左子树和右子树可能在区间内。思路能理解,但代码写不出来。

看文章

递归法

class Solution:
    def trimBST(self, root: TreeNode, low: int, high: int) -> TreeNode:
        if root is None:
            return None
        if root.val < low:
            # 寻找符合区间 [low, high] 的节点
            return self.trimBST(root.right, low, high)
        if root.val > high:
            # 寻找符合区间 [low, high] 的节点
            return self.trimBST(root.left, low, high)
        root.left = self.trimBST(root.left, low, high)  # root.left 接入符合条件的左孩子
        root.right = self.trimBST(root.right, low, high)  # root.right 接入符合条件的右孩子
        return root

迭代法

class Solution:
    def trimBST(self, root: TreeNode, L: int, R: int) -> TreeNode:
        if not root:
            return None
        
        # 处理头结点,让root移动到[L, R] 范围内,注意是左闭右闭
        while root and (root.val < L or root.val > R):
            if root.val < L:
                root = root.right  # 小于L往右走
            else:
                root = root.left  # 大于R往左走
        
        cur = root
        
        # 此时root已经在[L, R] 范围内,处理左孩子元素小于L的情况
        while cur:
            while cur.left and cur.left.val < L:
                cur.left = cur.left.right
            cur = cur.left # 左孩子的左孩子也需要继续判别,直到None
        
        cur = root
        
        # 此时root已经在[L, R] 范围内,处理右孩子大于R的情况
        while cur:
            while cur.right and cur.right.val > R:
                cur.right = cur.right.left
            cur = cur.right
        
        return root

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

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

做题

无思路。

看文章

为什么要强调转换成平衡二叉树?因为如果不强调,就可以直接用线性结构来构造二叉树。
解题的本质是寻找分割点,然后递归左右区间。二叉搜索树的中序遍历是有序数组,那么反过来,有序数组的最中间数就应该是root,所以,第一个分割点只需要取中间值(显然,如果数组长度为偶数,中间值就有2个,也就对应了两个解法)。
根据这个思路,自己尝试实现一下,AC了,代码如下:

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        size = len(nums)
        if size == 0:
            return None
        root_index = size // 2
        root_val = nums[root_index]
        root = TreeNode(val=root_val)

        nums_left = nums[:root_index]
        nums_right = nums[root_index+1:]

        root.left = self.sortedArrayToBST(nums_left)
        root.right = self.sortedArrayToBST(nums_right)

        return root

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

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

做题

无思路。

看文章

二叉搜索树的中序遍历是有序数组,那么,累加树只需要用反中序遍历(右中左),然后在遍历过程中不断叠加self.cur,然后更新root.val就可以了。自己尝试实现以下,AC了,代码如下:

class Solution:
    def __init__(self):
        self.cur = 0

    def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        if root is None:
            return 

        self.convertBST(root.right)
        self.cur += root.val
        root.val = self.cur
        self.convertBST(root.left)

        return root

二叉树总结

代码随想录:二叉树总结

以往忽略的知识点小结

  • 不断利用搜索二叉树的特性进行解题
  • 深度遍历是遍历到最底层,再往上返回

个人体会

完成时间:1h。
心得:题其实不难,但是一开始思路总是有点懵,看了提示之后也能自己实现;时间转瞬即逝,二叉树居然已经刷到了尾声,之前自己刷的时候,就是看到题目很多,刷到一半后没耐心再刷下去,还是要感谢训练营的“监督”,不管每次有没有很认真地刷,但“刷完”,理解完所有思路,我觉得也是一种不错的进步了。继续加油!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值