小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
判断一棵二叉树是否为搜索二叉树
问题描述
给定一棵二叉树,已知其中的节点没有重复值,请判断该二叉树是否为搜索二叉树。
输出描述:输出是否为搜索二叉树。
注意:空子树我们认为是符合搜索二叉树。
示例:
输入:{2,1,3}
输出:true
分析问题
首先,我们先来看一下搜索二叉树的定义。搜索二叉树满足如下条件
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
我们都知道中序遍历二叉树是先遍历左子树,然后遍历根节点,最后遍历右子树。而二叉搜索树保证了左子树的节点值均小于根节点的值,根节点的值均小于右子树的值。所以,当我们对二叉搜索树进行中序遍历时,得到的序列一定是升序的。这启示我们可以这么做,在中序遍历的过程中,检查当前节点的值是否大于中序遍历的前一个节点的值,如果均大于,说明中序遍历得到的序列是升序的,也就表明该树时二叉搜索树,否则不是。
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