题解 | 判断是不是二叉搜索树 参考题解

判断是不是二叉搜索树

https://www.nowcoder.com/practice/a69242b39baf45dea217815c7dedb52b

import sys
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param root TreeNode类 
# @return bool布尔型
#
import math
class Solution:
    """
    {3,2,5,1,4} 报错会返回true

          3 
         / \
         2  5
            /\
            1 4 
     二叉搜索树 需要  左子树 全部 < 根 < 右子树全部
     需要使用中序递归 中序是递增序列


    """
    def isValidBST_error(self , root: TreeNode) -> bool:
        # write code here
        def  dfs(root):
            if not root:
                return True
            if not  root.left and not root.right:
                return True 
            if root.left and root.right:
                if root.left.val<root.val and  root.right.val>root.val:
                    return dfs(root.left) and dfs(root.right)
                else:
                    return False
            else:
                return False 
        return dfs(root)
    def isValidBST_1(self , root: TreeNode) -> bool:
        
        def dfs(root,min_val,max_val):
            # 节点为空
            if not root:
                return True
            # 值不满足要求
            if  root.val <=min_val or root.val >=max_val:
                return False 
            return dfs(root.left ,min_val,root.val ) and dfs(root.right,root.val,max_val)
        #return dfs(root ,-inf,inf ) # 在牛客 导入 import math 会报错
        return dfs(root ,-2**32,2**31  )
    import sys
    # 中序遍历方法: https://www.nowcoder.com/practice/a69242b39baf45dea217815c7dedb52b?tpId=295&tqId=2288088&sourceUrl=%2Fexam%2Foj%3FquestionJobId%3D10%26subTabName%3Donline_coding_page
    # pre =-sys.maxsize-1
    # def isValidBST_2(self , root: TreeNode) -> 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 
    #     # 遍历右子树
    #     if not self.isValidBST(root.right):
    #         return False
    #     return True 
    def isValidBST(self , root: TreeNode) -> bool:
        """
          栈使用 
          直到没有左节点
          while(head!=null)
             s.push(head)
             head=head.left
          然后进入右子树
         
         实现步骤: 
         1. 定义一个stack 保存访问的节点
         2. 定义一个数组arr保存中序遍历的val 
         3.  root 指向不为空 ,栈stack 不为空
             3.1循环遍历到最左侧压栈
             3.2 取出栈stack 栈顶
             3.3 将栈顶的值加入arr
             3.4 进入右边 root=root.right
        4. 遍历中序结果 arr 如果出现降序则不是搜索树


        """
        st=[]
        arr=[]

        while st or root:
            #压栈
            while root:
                st.append(root)
                root=root.left 
            root=st.pop()
            arr.append(root.val)
            root=root.right
        for i in range(1,len(arr)):
            if (arr[i-1]>arr[i]):
                return False
        
        return True 



        

         
    
        
            

全部评论

相关推荐

点赞 评论 收藏
分享
mjasjon:这种trash中厂 简历过筛概率比大厂还低(除阿里系)
投递哔哩哔哩等公司6个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务