难度:中等
题目描述:
思路总结:
还差的远啊,多做题吧,先见多识广,然后再总结,专项突破。别见啥题,啥新鲜,一点思路都没有,有什么可总结的呢。
题解一:(递归)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
#这个解法对我个人的启发就是,首先,判空放在递归体里。第二,递归体返回的是true/false的时候,如果体内判断的是false条件,那么最后不要忘记返回true。第三,对于这题来说,将树根节点与左右子节点的判断可以转换成上下界的判断。即当前节点值要≥下界,≤上界。左:(根的下界,根的值),右:(根的值,根的上界)。
class Solution:
def isValidBST(self, root: TreeNode) -> bool:
#思路:看到第三条特征的介绍,想到了要使用递归。
def helper(node, lower=float('-inf'), upper=float('inf')):
if not node:return True
val = node.val
if val<=lower or val>=upper:
return False
if not helper(node.left, lower, val):
return False
if not helper(node.right, val, upper):
return False
return True
return helper(root)
题解一结果:
改错记录:
测试用例:[1,1]
预期结果:false
当前通过:65 / 75 个
测试用例:[10,5,15,null,null,6,20]
预期结果:false
当前通过:70 / 75 个
题解二:(迭代——栈)
# 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:
#思路:看到第三条特征的介绍,想到了要使用递归。
if not root:return True
stack = [(root, float('-inf'), float('inf'))]
while stack:
cur, lower, upper = stack.pop()
if cur.val <= lower or cur.val >= upper:
return False
if cur.left:
stack.append((cur.left, lower, cur.val))
if cur.right:
stack.append((cur.right, cur.val, upper))
return True
return helper(root)
# 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:
#思路:看到第三条特征的介绍,想到了要使用递归。
if not root:return True
stack, prev = [], float('-inf')
while stack or root: #这里root只涉及到第一个判断
while root:
stack.append(root)
root = root.left
root = stack.pop()
if root.val <= prev:
return False
prev = root.val
root = root.right
return True