LeetCode : 98. 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 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:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def Create_tree(root,list,i):
if i<len(list):
if not list[i]: return None # 返回值 == None,以下不必判断
else:
root = TreeNode(list[i])
root.left = Create_tree(root.left,list,i*2+1)
root.right= Create_tree(root.right,list,i*2+2)
return root
return root
中序遍历:递归+迭代
class Solution:
# 中序 递归遍历
def isValidBST(self, root: TreeNode) -> bool:
res = []
def helper(root):
if not root: return None
helper(root.left)
res.append(root.val)
helper(root.right)
helper(root)
return res==sorted(res) and len(set(res))==len(res)
# 中序 迭代遍历
def isValidBST2(self, root: TreeNode) -> bool:
res =[]
if not root: return res
stack =[]
p = root
while p or stack:
while p:
stack.append(p)
p=p.left
p=stack.pop()
res.append(p.val)
p = p.right
# return res
return res==sorted(res) and len(set(res))==len(res)
python 知识点: len(set(res))==len(res)
set 将列表转换成元组同时去除其中的重复元素
测试代码:
if __name__ == "__main__":
s = Solution()
nums= [5,1,4,None,None,3,6]
root = Create_tree(None,nums,0)
r = s.isValidBST(root)
print(r)