給定一個二叉樹,判斷它是不是合法的二叉查找樹(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