题目
实现一个函数,检查一棵二叉树是否为二叉搜索树。
示例1:
输入:
2
/ \
1 3
输出: true
示例2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
分析: 首先理解二叉搜索树的条件,即对任意一个根节点,其左子树所有的值均小于根节点值,右子树所有节点的值均大于根节点的值。同时它的左右子树也满足二叉搜索树的条件。
方法一: 设计递归函数F(root, lower, upper)从root节点开始,递归调用每一个根节点,以当前节点为根节点的左右子树必须满足上述条件,即左右子树节点值必须在(lower,upper)之间,在递归调用左子树时,需要将区间的upper值更新为root节点值,同理在递归调用右子树时,需要将lower值跟新为root节点值,一旦发现不满足的情况,即整个二叉树不满足
class Solution:
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
mini = float("-inf")
maxi = float("inf")
return self.BST_judge(root, mini, maxi)
def BST_judge(self, root, mini, maxi):
if not root:
return True
val = root.val
judge1 = self.BST_judge(root.left, mini, val)
judge2 = self.BST_judge(root.right, val, maxi)
if val > mini and val < maxi and judge1 and judge2:
return True
else:
return False
方法二: 根据二叉搜索树的条件,可以得知树的中序遍历(LDR)节点值必然满足升序的条件,因此,可以通过中序遍历进行判断
class Solution:
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
judge = self.LDR(root, [])
return judge
def LDR(self, root, queue):
if root == None:
return True
judge = self.LDR(root.left, queue)
if queue:
pre_val = queue.pop(0)
if root.val <= pre_val or not judge:
queue.append(root.val)
return False
queue.append(root.val)
judge = self.LDR(root.right, queue)
return judge