题目描述:
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
分析:
利用中序遍历的结果是升序这个性质,判断每个节点的值是否大于先前遍历的最大值。
实现中需要记录两个全局变量,最大值max_val和结果res。
代码:
执行用时: 64 ms, 在Validate Binary Search Tree的Python3提交中击败了96.73% 的用户
内存消耗: 10 MB, 在Validate Binary Search Tree的Python3提交中击败了26.47% 的用户
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if not root:
return True
def dfs(node, max_val, res):
if node.left:
dfs(node.left, max_val, res)
if node.val > max_val[0] and res[0]:
max_val[0] = node.val
else:
res[0] = False
return None
if node.right:
dfs(node.right, max_val, res)
max_val = [-2147483649]
res = [True]
dfs(root, max_val, res)
return res[0]
复杂度:
n为列表的长度
时间复杂度O(n)O(n)O(n),空间复杂度O(1)O(1)O(1)