• 【力扣刷题】验证二叉搜索树


    98.验证二叉搜索树
    给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
    有效 二叉搜索树定义如下:
    节点的左子树只包含 小于 当前节点的数。
    节点的右子树只包含 大于 当前节点的数。
    所有左子树和右子树自身必须也是二叉搜索树。

    在这里插入图片描述
    一开始拿到这道题以为很简单,就直接递归。但是递归有一些细节处理不好,比如:
    ①如何避免右子树存在比根节点小或者相等的节点;

    ②如何避免左子树存在比根节点大或者相等的节点;

    刚开始尝试使用递归加上全局变量max来判断,无奈能力有限,以失败告终。先通过之后再在参考答案中学习。

    后来就尝试迭代,通过中序遍历并对比结果与排序后的结果是否一致来达到验证的效果。虽然通过了测试用例,但是用时惨不忍睹。确实是缺乏经验,需要多刷题来弥补自身短板。

    我的代码:

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution(object):
        def isValidBST(self, root):
            """
            :type root: TreeNode
            :rtype: bool
            """
            if not root:
                return True     
            stack = []  # 中序遍历使用栈
            result = []  # 结果
            temp = root  # 当前节点
    
            while temp or stack:
                if temp != None:
                    stack.append(temp)
                    temp = temp.left
    
                else:
                    temp = stack.pop()
                    if temp.val not in result:
                        result.append(temp.val)
                    else:
                        return False
                    temp = temp.right
    
            compare = []
            for x in result:
                compare.append(x)
            result.sort()
            for i in range(len(result)):
                if compare[i] != result[i]:
                    return False
    
            return True                    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这里插入图片描述

    提交后学习了其他人的递归算法,也找到了自己一开始递归无法通过测试的原因,但全局变量这个想法是对的。使用递归后,执行用时明显缩短了。

    递归代码:

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution(object):
        def __init__(self):
            self.pre = -21474836480
    
        def isValidBST(self, root):
            """
            :type root: TreeNode
            :rtype: bool
            """
            if not root:
                return True
    
            if not self.isValidBST(root.left):
                return False
            
            if root.val <= self.pre:
                return False
            self.pre = root.val
    
            return self.isValidBST(root.right)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    『忘了再学』Shell基础 — 24、Shell正则表达式的使用
    Vue:watch的多种使用方法
    Cisco简单配置(九)—三层交换机
    阿里拆了中台,中台还有未来吗?
    如何将48位立即数加载到ARM通用寄存器中?
    (四)Spring源码解析:bean的加载流程
    【C++】set & map的使用
    Java开发经典实战!2022 国内知名大厂Java岗面经
    Python基础:输入输出详解-输出字符串格式化
    Java项目(二)--Springboot + ElasticSearch 构建博客检索系统(4)- SpringBoot集成ES
  • 原文地址:https://blog.csdn.net/weixin_49592304/article/details/127136078