判断一棵二叉树是否为搜索二叉树

253 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

判断一棵二叉树是否为搜索二叉树

问题描述

给定一棵二叉树,已知其中的节点没有重复值,请判断该二叉树是否为搜索二叉树。

输出描述:输出是否为搜索二叉树。

注意:空子树我们认为是符合搜索二叉树。

示例:

输入:{2,1,3}

输出:true

分析问题

首先,我们先来看一下搜索二叉树的定义。搜索二叉树满足如下条件

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

我们都知道中序遍历二叉树是先遍历左子树,然后遍历根节点,最后遍历右子树。而二叉搜索树保证了左子树的节点值均小于根节点的值,根节点的值均小于右子树的值。所以,当我们对二叉搜索树进行中序遍历时,得到的序列一定是升序的。这启示我们可以这么做,在中序遍历的过程中,检查当前节点的值是否大于中序遍历的前一个节点的值,如果均大于,说明中序遍历得到的序列是升序的,也就表明该树时二叉搜索树,否则不是。

image-20211022171012254.png

class Solution:
    def isValidBST(self, root) :
        stack = []
        #中序遍历的前一个节点的值
        pre_data = float('-inf')

        while stack or root:
            #一直遍历到最左边的孩子
            while root:
                stack.append(root)
                root = root.left
            #栈中弹出一个元素
            root = stack.pop()
            #节点的值小于等于中序遍历的前一个pre_data,
            #说明不是二叉搜索树,直接返回false
            if root.val <= pre_data:
                return False
            pre_data = root.val
            #遍历右子树
            root = root.right

        return True