0098. 验证二叉搜索树
题目地址(98. 验证二叉搜索树)
https://leetcode-cn.com/problems/validate-binary-search-tree/
题目描述
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
前置知识
中序遍历
公司
阿里
腾讯
百度
字节
思路
中序遍历
这道题是让你验证一棵树是否为二叉查找树(BST)。 由于中序遍历的性质如果一个树遍历的结果是有序数组,那么他也是一个二叉查找树(BST), 我们只需要中序遍历,然后两两判断是否有逆序的元素对即可,如果有,则不是 BST,否则即为一个 BST。
定义法
根据定义,一个结点若是在根的左子树上,那它应该小于根结点的值而大于左子树最小值;若是在根的右子树上,那它应该大于根结点的值而小于右子树最大值。也就是说,每一个结点必须落在某个取值范围:
根结点的取值范围为(考虑某个结点为最大或最小整数的情况):(long_min, long_max)
左子树的取值范围为:(current_min, root.value)
右子树的取值范围为:(root.value, current_max)
关键点解析
二叉树的基本操作(遍历)
中序遍历一个二叉查找树(BST)的结果是一个有序数组
如果一个树遍历的结果是有序数组,那么他也是一个二叉查找树(BST)
代码
中序遍历
语言支持:JS,C++, Java
JavaScript Code:
C++ Code:
Java Code:
定义法
语言支持:C++,Python3, Java, JS
C++ Code:
Python Code:
Java Code:
JavaScript Code:
复杂度分析
时间复杂度:$O(N)$
空间复杂度:$O(N)$
相关题目
230.kth-smallest-element-in-a-bst
大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 37K star 啦。 大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。 
最后更新于
这有帮助吗?