代码随想录算法训练营第20天 |最大二叉树、合并二叉树、二叉搜索树中的搜索、验证二叉搜索树

1、最大二叉树

class Solution:
    def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
        if not nums: return None # 终止条件
        root_val = max(nums) # 求出当前数组最大值
        val_id = nums.index(root_val) # 找出最大值下表,供后序切割数组
        root = TreeNode(root_val) # 构建节点
        nums_left, nums_right = nums[:val_id], nums[val_id + 1:] # 切割数组
        root.left = self.constructMaximumBinaryTree(nums_left) # 向左遍历
        root.right = self.constructMaximumBinaryTree(nums_right) # 向右遍历
        return root #返回根节点

思路如注释

2、合并二叉树

class Solution:
    def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
        if not root1 and not root2: return None # 如果两棵树都为空
        if not root1 and root2: return root2    #其中一颗树不为空
        if root1 and not root2: return root1

        root1.val = root1.val + root2.val # 都不为空就相加
        root1.left = self.mergeTrees(root1.left, root2.left) # 向左遍历
        root1.right = self.mergeTrees(root1.right, root2.right) # 向右遍历
        return root1 # 返回根节点

3、二叉搜索树中的搜索

class Solution:
    def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        if not root: return None
        if root.val == val: # 找到了节点,返回
            return root
        if val < root.val: # 小于就向左遍历,反之亦然
            return self.searchBST(root.left, val)
        else:
            return self.searchBST(root.right, val)

4、验证二叉搜索树

class Solution:
    def valid(self, root, min_val, max_val):
        if not root: return True # 搜到底了,返回True
        if root.val <= min_val or root.val >= max_val:
            return False
        
        #限定:左子树的值只能在最小值到父节点之间;右节点的值只能在父节点到最大值之间,最小最大随
        #迭代不断更新,其实就是不断缩小范围
        return self.valid(root.left, min_val, root.val) and self.valid(root.right, root.val, max_val)
        
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        return self.valid(root,float('-inf'),float('inf'))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值