LeetCode题目:合法二叉搜索树
题目链接:合法二叉搜索 树
题目描述:实现一个函数,检查一棵二叉树是否为二叉搜索树。
两种思路:
1.采用递归的的思想
2.采用中序遍历的方法
方法一:递归法
思想:对每一个节点设置左右边界,也就是大小区间。根节点root.val的大小区间为[-∞,+∞],对于左子节点father.left.val区间就是父节点左边界到父节点的值,对于右子节点father.right.val区间就是父节点的值到父节点的右边界。一旦出现不满足上述调节则返回False。代码如下:
#递归法1:
def isValidBST(self, root):
if root == None:
return True
# 输入本节点、左边界、右边界,flag=0表示左子树,flag=1表示右子树
def recurse(root, left_border, right_border):
if root.left != None: # 如果左子树存在
if root.left.val > left_border and root.left.val < root.val:
if recurse(root.left, left_border, root.val) == False:
return False
else:
return False
if root.right != None: # 如果存在右子树
if root.right.val > root.val and root.right.val < right_border:
if recurse(root.right, root.val, right_border) == False:
return False
else:
return False
return True
return recurse(root, -float('inf'), float('inf'))
#优化代码:
def isValidBST(root):
def isValid(root,min,max)
if root==None:
return True
if min!=None and root.val<=min:return False
if max!=None and root.val>=max:return False
return isValid(root.left,min,root.val) and isValid(root.right,root.val,max)
return isValid(root,None,None)
方法二:中序遍历
思想:如果是二叉搜索树则中序遍历为有序。每遍历到一个新节点,判断当前节点值与前一个节点值的大小,不大于则不是二叉搜索树。
def isValidBST(self, root):
if root == None:
return True
def recurse(root, pre): #这里的pre变量必须是引用类型,不能是常量,常量没办法回溯
if root == None:
return True
if recurse(root.left, pre) == False: # 回溯
return False
if root.val <= pre[0]: # 如果当前节点值不大于前一个节点值则返回False
return False
else:
pre[0] = root.val
if recurse(root.right, pre) == False:
return False
return True #子树有序返回True
return recurse(root, [-float('inf')])