98.验证二叉搜索树

难度:中等
题目描述:

思路总结
还差的远啊,多做题吧,先见多识广,然后再总结,专项突破。别见啥题,啥新鲜,一点思路都没有,有什么可总结的呢。
题解一:(递归)

# 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)
            

题解一结果:
98.验证二叉搜索树_第1张图片
改错记录
测试用例:[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)

题解二结果:
98.验证二叉搜索树_第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:
        #思路:看到第三条特征的介绍,想到了要使用递归。
        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

题解三结果:
98.验证二叉搜索树_第3张图片

你可能感兴趣的:(朱滕威的面试之路)