20200505每日一题
题目描述
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
分析
1.递归
直接递归判断左右子树的val是否在一个范围内
根节点范围确定为负无穷到正无穷
左子树范围为负无穷到根节点
右子树范围为根节点到正无穷
2.结合中序遍历
若把二叉树中序遍历存为一个列表,则每一个val均大于前一个val
注意是大于,临界值等于不可!
解题
1.
# 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: TreeNode) -> bool: def digui(node, lower, upper): if not node: return True mid = node.val if not lower < mid < upper: return False return digui(node.left,lower,mid) and digui(node.right,mid,upper) return digui(root,float('-inf'),float('inf'))
2.
# 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: TreeNode) -> bool: mid=[] def mid_trav(node): if not node: return True if node.left: mid_trav(node.left) mid.append(node.val) if node.right: mid_trav(node.right) mid_trav(root) if(mid == sorted(mid) and len(set(mid)) == len(mid)): return True else: return False