分类:Tree
难度: medium
算法:中序遍历 or 判断临界值
- 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
题解
-
中序遍历
若为二叉搜索树,则中序遍历是一个递增的数组,则使用栈做中序遍历,判断当前遍历值是不是大于前一个值即可 -
判断临界值
递归的方法,往左右子树传递需要满足的最大值、最小值
代码
- 中序遍历
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if not root:
return True
stack = [[root,0]]
val = float('-inf')
while stack:
node,state = stack.pop()
if state ==0 :
if node.right:
stack.append([node.right,0])
stack.append([node,1])
if node.left:
stack.append([node.left,0])
else:
if node.val <= val:
return False
val = node.val
return True
- 判断临界值
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
def helper(node,minval,maxval):
if not node:
return True
left_res = helper(node.left,minval,min(node.val,maxval))
right_res = helper(node.right,max(node.val,minval),maxval)
return node.val > minval and node.val< maxval and left_res and right_res
return helper(root,float("-inf"),float("inf"))