代码随想录算法训练营0526| 654.最大二叉树、617.合并二叉树 、700.二叉搜索树中的搜索、98.验证二叉搜索树

前两题构造二叉树先跳过,二刷补上

654.最大二叉树

构造二叉树,先跳过

617.合并二叉树

暂时跳过

700.二叉搜索树中的搜索

二叉搜索树:树上的数值是有序的,按照左子树<根节点<右子树排列。(因此二叉搜索树需要用中序遍历,才能发挥他这个特点)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def searchBST(self, root: Optional[TreeNode], val: int) -> Optional[TreeNode]:
        if not root or root.val == val:
            return root

        if root.val < val:#在右子树
            return self.searchBST(root.right,val)#找到了return的结果就是输入的root,否则就是null

        if root.val > val:#在左子树
            return self.searchBST(root.left,val)

二分下面别忘了要return:如果不单独return的话,当root等于叶子节点的时候

98.验证二叉搜索树

1、思路一:

将层序存储的二叉树,中序遍历一次,就是从左到右,从下到上的顺序了。通过比较遍历得到的数组是不是递增的,可以得到是否为有效的二叉搜索树

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution:
    def __init__(self):
        self.vector = []

    def dfs(self, root: Optional[TreeNode]):#中序遍历,二叉树变递增数组
        if not root:
            return 
        self.dfs(root.left)
        self.vector.append(root.val)
        self.dfs(root.right)        

    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True      
        self.dfs(root)
        # print(self.vector)
        for i in range(len(self.vector)-1):
            if self.vector[i] >= self.vector[i+1]:
                return False
        return True

2、思路二:

一次比较左右节点和父节点的值。注意有个坑,不应该仅局限于这三个值的比较,还有一点是右子树的全部值都应该大于左子树。因此需要取一个极小值方便比较。

同样用中序遍历,先验证左节点是否满足,再验证右子树是否满足

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

class Solution: 
    def __init__(self):
        self.minval = float('-inf')#定义一个极小值作为初始值

    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True      

        ##使用中序遍历不断更新极小值
        res_left = self.isValidBST(root.left)#左子树是否满足
        if root.val > self.minval:
            self.minval = root.val
        else:
            return False
        res_right = self.isValidBST(root.right)#右子树是否满足

        return res_left and res_right

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值