98_验证二叉搜索树

旧城冷巷雨未停 提交于 2019-12-15 16:23:41
"""
给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
"""

from TreeNode import TreeNode

# 递归
def isValidBST1(root):

    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.right, val, upper):
            return False
        if not helper(node.left, lower, val):
            return False
        return True

    return helper(root)

# 时间复杂度:o(N) 每个节点访问一次
# 空间复杂度:o(N) 我们跟进了整棵树


# 迭代
def isValidBST2(root):
    if not root:
        return True

    stack = [(root, float("-inf"), float("inf")), ]
    while stack:
        root, lower, upper = stack.pop()
        if not root:
            continue
        val = root.val
        if val <= lower or val >= upper:
            return False

        stack.append((root.right, val, upper))
        stack.append((root.left, lower, val))

    return True

root1 = TreeNode(5)
root2 = TreeNode(1)
root3 = TreeNode(7)
root4 = TreeNode(6)
root5 = TreeNode(8)
root6 = TreeNode(10)
root7 = TreeNode(9)

root1.left = root2
root1.right = root3

root3.left = root4
root3.right = root5

root4.left = root6
root4.right = root7

print(isValidBST2(root1))



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!