📜  如何检查二叉树是否为 BST (1)

📅  最后修改于: 2023-12-03 15:38:50.134000             🧑  作者: Mango

如何检查二叉树是否为 BST

在计算机科学中,二叉搜索树(Binary Search Tree,简称BST)是一种常用的数据结构。它是用于保持元素集合的关联数组。这个结构具有能对元素进行快速查找、插入和删除的特点。但是,有些时候我们需要检查一棵二叉树是否是BST。下面我们将会介绍如何检查二叉树是否为BST。

BST 的特点

二叉搜索树除了具有二叉树的结构特点外,还有以下BST特点:

  • 对于二叉搜索树的每个节点,左子树中所有结点的值都小于它,右子树中所有结点的值都大于它;
  • 对于二叉搜索树的每个节点,其左子树和右子树都是二叉搜索树。
实现

二叉树是否为BST的判断,最基本的思想就是利用中序遍历。中序遍历BST得到的结果是有序序列,因此如果二叉树的中序遍历结果是有序的,那么就可以判断它是BST。

下面提供一个 Python 版本的程序:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

def isValidBST(root: TreeNode) -> bool:
    if not root:
        return True
    stack = []
    inorder = float('-inf')
    while stack or root:
        while root:
            stack.append(root)
            root = root.left
        root = stack.pop()
        if root.val <= inorder:
            return False
        inorder = root.val
        root = root.right
    return True

其实现过程如下:

  • 如果输入树为空,则返回True,因为一个空树的处理是一个BST。
  • 初始化一个栈和inorder,inorder表示前一个节点最小的值。遍历该树。
  • 如果节点非空,则将该节点添加到栈中。同时移动指针到其左跟节点。
  • 当节点为空时,说明我们已经访问了最左侧的节点。此时,弹出一个节点并检查其值是否大于inorder。如果是,则问题就出现了,因为我们正在遍历中序序列。否则继续进行。
  • 记录inorder为当前节点的值。
  • 将指针移动到当前节点的右子树,继续进行遍历,重复步骤2-6,直到遍历完整个树。

以上就是一个较简单的检查 BST 程序。