leetcode 98 Validate Binary Search Tree
题目描述:
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
The left subtree of a node contains only nodes with keys less than the node's key.
The right subtree of a node contains only nodes with keys greater than the node's key.
Both the left and right subtrees must also be binary search trees.
Example 1:
2
/ \
1 3
Binary tree [2,1,3], return true.
Example 2:
1
/ \
2 3
Binary tree [1,2,3], return false.
分析:
中序遍历,比较当前节点的值是否大于前一个节点的值,若始终满足大于,则返回真,否则返回假。
法一,需要额外的O(n)的空间
题目描述:
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
The left subtree of a node contains only nodes with keys less than the node's key.
The right subtree of a node contains only nodes with keys greater than the node's key.
Both the left and right subtrees must also be binary search trees.
Example 1:
2
/ \
1 3
Binary tree [2,1,3], return true.
Example 2:
1
/ \
2 3
Binary tree [1,2,3], return false.
分析:
中序遍历,比较当前节点的值是否大于前一个节点的值,若始终满足大于,则返回真,否则返回假。
法一,需要额外的O(n)的空间
Python代码:
# 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 root is None:
return True
if root.left==None and root.right==None:
return True
self.List=[]
self.left_root_right(root) #调用left_root_right()函数,中序遍历二叉搜索树,将节点的值存入列表List中
for i in range(1,len(self.List)):
if self.List[i]<=self.List[i-1]: #通过for循环遍历列表,若当前值少于或等于前一个值,则返回False
return False
return True
def left_root_right(self,root):
if root==None:
return
self.left_root_right(root.left) #中序遍历当前子树的左子树
self.List.append(root.val) #将当前子树的根节点的值存入列表List中
self.left_root_right(root.right)#中序遍历当前子树的右子树
法二,不需要额外的O(n)空间
Python代码:
# 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):
pre=None
'''为Solution类添加pre数据成员,在中序遍历二叉搜索树的过程中,pre用来指向当前节点的前驱节点。
注意:pre不能放在isValidBST函数的内部。如果将pre放在isValidBST函数的内部,则每一次递归调用isValidBST函数的时候,
pre都将重新赋值为None。实际上,在每一次递归调用时,我们需要的是上一次调用结束时pre的值'''
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if root is None:
return True
Bool= self.isValidBST(root.left)
if self.pre!=None:
Bool=Bool and (self.pre.val<root.val)
self.pre=root
Bool=Bool and self.isValidBST(root.right)
return Bool