📜  检查二叉树是否为 BST 的迭代方法(1)

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

检查二叉树是否为 BST 的迭代方法

在二叉树中,一棵二叉树可以是二叉查找树(Binary Search Tree,BST)的前提是每个节点的键值大于其左子树中的任何节点的键值,且小于其右子树中的任何节点的键值。

如果您想要检查一个二叉树是否为 BST,下面是使用迭代方法的一种方式。

def is_bst_iterative(root):
    if root is None:
        return True
        
    stack = []
    prev_val = -sys.maxsize - 1
        
    while root or stack:
        while root:
            stack.append(root)
            root = root.left
                
        root = stack.pop()
        if root.val <= prev_val:
            return False
        prev_val = root.val
        root = root.right
            
    return True

该函数的参数 root 是根节点。

函数中,首先判断了根节点是否为空,如果为空,则该二叉树是 BST,返回 True

接着,我们创建一个空的列表 stack 用于存放树中待处理的节点。并初始化 prev_val,该变量将在迭代过程中用于存储前一个节点的值。

接下来,进入了一个循环,只有当根节点为空且 stack 也为空时才会退出循环。

在循环内部,我们首先将根节点入栈,并将指针 root 移向左子树,一直到最左边的叶节点。这是因为在 BST 中,左子树中的所有节点的键值都小于其根节点的键值,我们需要逐步比较所有的左子树节点。当到达最左叶节点时,就开始了回溯过程。

我们将弹出栈中的一个节点,并将其键值与 prev_val 比较,如果小于等于 prev_val,则该二叉树不是 BST,直接返回 False;否则,将该节点的键值作为 prev_val 的新值,并将指针 root 指向当前节点的右子树节点(如果存在的话)。

循环结束后,如果没有返回 False,则该二叉树是 BST,返回 True

这是一种使用迭代方法检查二叉树是否为 BST 的方法。其他方法包括使用递归、中序遍历等。