判斷合法二叉搜索樹

給定一個二叉樹,判斷它是不是合法的二叉查找樹(BST)node

一棵BST定義爲:python

    節點的左子樹中的值要嚴格小於該節點的值。
    節點的右子樹中的值要嚴格大於該節點的值。
    左右子樹也必須是二叉查找樹。
    一個節點的樹也是二叉查找樹。app

兩種解法:less

遞歸

class Solution(object):
    def isValidBST(self, root, left=float("-inf"), right=float("inf")):
        """
        噹噹前判斷的節點在左邊時,它應該比右上的父親小,噹噹前判斷的節點在右邊時,它應該比左上的父親大,不然返回False。
        若是到葉子節點都未返回False的話,那麼就所有合法,返回True便可
        :type root: TreeNode
        :rtype: bool
        """
        if not root:
            return True
        if root.val >= right or root.val <= left:
            return False
        return self.isValidBST(root.left, left, min(right, root.val)) \
               and self.isValidBST(root.right, max(left, root.val), right)

迭代

class Solution(object):
    def isValidBST(self, root):
        """
        迭代方式,定義跟節點及其節點應該對應的值範圍,初始值範圍設爲[float('-inf'), float('inf')]
        左側節點取 min(父節點的值,上次範圍大值)
        右側節點取 max(上次範圍小值,父節點的值)
        循環到當前節點只須要判斷是否在此範圍內便可
        見下示例:中間中括號裏的爲樹節點元素,左右爲定義的合法範圍
                好比3下左節點1,它的範圍右側的值就是 min(inf, 3)
                好比3下右節點5,它的範圍左側的值就是 max(-inf, 3)
                  -inf <[3]< inf
                       /   \
                     /       \
                    /          \
            -inf <[1]< 3      3 <[5]< inf
                 /  \             / \
                /    \           /    \
               /      \         /       \
        -inf<[0]<1  1<[2]<3  3<[4]<5 5<[6]<inf
        :param root:
        :return:
        """
        if not root:
            return True
        p = [[root,float('-inf'), float('inf')]]
        while len(p) > 0:
            tmp = p.pop(0)
            node = tmp[0]
            less = tmp[1]
            larger = tmp[2]
            if less < node.val < larger:
                pass
            else:
                return False
            if node.left:
                p.append([node.left, less, min(node.val, larger)])
            if node.right:
                p.append([node.right, max(less, node.val), larger])
        return True
相關文章
相關標籤/搜索