题目描述
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
解题思路
使用二叉树的中序遍历,遍历出来的结果是一个升序的数组
如果该二叉树的中序遍历结果是升序并且大小一样,那么该数组就是二叉搜索树。
中序遍历
- 若二叉树为空,为空操作;否则
- 中序遍历左子树;
- 访问根节点;
- 中序遍历右子树。
代码
class Solution(object):
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
res = []
def inorder(root):
if not root:
return
inorder(root.left)
res.append(root.val)
inorder(root.right)
helper(root)
return res == sorted(res) and len(set(res)) == len(res)
算法复杂度
- 二叉搜索树的时间复杂度:
平均情况下为 O ( l o g n ) O(logn) O(logn),但在单支树的情况下就变成了顺序遍历搜素,复杂度退化为 O ( n ) O(n) O(n)。 - 二叉树的空间复杂度:
因为需要建立排序二叉树,所以空间复杂度为 O ( n ) O(n) O(n)
常用的排序/查找算法的时间复杂度和空间复杂度:https://blog.csdn.net/liu891208/article/details/47778415
常用的排序算法的时间复杂度和空间复杂度:https://blog.csdn.net/wuxinyicomeon/article/details/5996675
如有错误,请批评指正!