视频教程中只提到了该类型的题目,却没有给出相关例题,此处用leetcode题目代替
题目:
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/validate-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
由题可知:一个搜索树,其中序遍历必然是有序的。因此可以用last记录前一个结点的值,初始化为-inf。只需要判断中序遍历中是否每一个数都比前一个数大即可。中序遍历相关代码可见:二叉树-7.1 二叉树序列打印_Iamlzm的博客-优快云博客
由于要得到搜索树上最左边的值,递归的方法不太好做,这里可以用迭代或者morris方法完成
代码:
迭代方法:
class Solution(object):
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
last = -float('inf')
cur = root
st = []
while cur or st:
while cur:
st.append(cur)
cur = cur.left
top = st.pop()
if top.val > last:
last = top.val
else:
return False
if top.right:
cur = top.right
return True
morris方法:
class Solution(object):
def isValidBST(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
last = -float('inf')
p1, p2 = root, None
while p1:
p2 = p1.left
if p2:
while p2.right and p2.right != p1:
p2 = p2.right
if not p2.right:
p2.right = p1
p1 = p1.left
continue
else:
p2.right = None
if last >= p1.val:
return False
last = p1.val
p1 = p1.right
return True