📜  数据结构|二叉搜索树|问题4(1)

📅  最后修改于: 2023-12-03 14:54:56.574000             🧑  作者: Mango

数据结构 | 二叉搜索树 | 问题4
问题描述

给定一个二叉搜索树,实现一个函数,判断其是否为一个有效的二叉搜索树。

一棵二叉搜索树定义如下:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。
解决方案

方法一:中序遍历

二叉搜索树中序遍历的结果是一个升序的数组,因此可以通过中序遍历二叉搜索树并保存前一个元素的值,然后比较当前遍历到的元素是否大于前一个元素。如果大于,继续遍历;如果小于或等于,返回 false。时间复杂度和空间复杂度都是 O(n)。

代码如下:

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        stack, inorder = [], float('-inf')
        while stack or root:
            while root:
                stack.append(root)
                root = root.left
            root = stack.pop()
            # 如果当前值小于等于前一个 inorder,则不是 BST。
            if root.val <= inorder:
                return False
            inorder = root.val
            root = root.right
        return True

方法二:递归

可以按照 BST 的定义,递归判断左右子树是否是 BST,并且满足当前节点大于左子树的最大值,小于右子树的最小值。由于需要递归检查每一个节点,时间复杂度和空间复杂度都是 O(n)。

代码如下:

class Solution:
    def isValidBST(self, root: TreeNode) -> bool:
        def helper(node, lower=float('-inf'), upper=float('inf')):
            if not node:
                return True
            if node.val <= lower or node.val >= upper:
                return False
            if not helper(node.right, node.val, upper):
                return False
            if not helper(node.left, lower, node.val):
                return False
            return True

        return helper(root)
总结

本文介绍了两种解决方法,一种是中序遍历,一种是递归。两种方法时间复杂度和空间复杂度都是 O(n),可以根据实际情况选择使用。