【LeetCode】98. Validate Binary Search Tree 解題報告(Python)

題目分析:

給定一個二叉樹,判斷其是否是一個有效的二叉搜索樹。
假設一個二叉搜索樹具有如下特徵:

  1. 節點的左子樹只包含小於當前節點的數。
  2. 節點的右子樹只包含大於當前節點的數。
  3. 所有左子樹和右子樹自身必須也是二叉搜索樹。

示例 1:
在這裏插入圖片描述
輸出: true

示例 2:
在這裏插入圖片描述
解題思路:

初看這一題是懵逼的,經過評論區的提醒發現核心就四個字:中序遍歷,對於一個搜索樹中序遍歷爲升序,這樣我們就可以把問題轉化爲兩個簡單的問題,(1)中序遍歷(2)結果是否爲升序。由於中序遍歷有兩種方法,故本題也提供兩種解法

  1. 中序遍歷我們有兩種方法,遞歸或者棧,詳見【LeetCode】94. Binary Tree Inorder Traversal
  2. 結果是否爲升序我們並不用全部遍歷,只要出現了某個元素比前面的小,我們就知道該返回False了
  3. 代碼理解困難可以反覆設置斷點調試或者參考【LeetCode】94. Binary Tree Inorder Traversal

提交代碼1:(遞歸,Runtime: 56 ms, faster than 53.14% )

class Solution:
    def isValidBST(self, root: 'TreeNode') -> bool:
        res = []
        self.last_val = -2147483649
        self.flag = True
        def pre_order(tree):
            if tree == None:
                return
            pre_order(tree.left)
            if tree.val != None:
                if tree.val <= self.last_val:
                    self.flag = False
                self.last_val = tree.val
            if self.flag:
                pre_order(tree.right)
        pre_order(root)
        return self.flag

提交代碼2:(棧,Runtime: 52 ms, faster than 88.30% )

class Solution:
    def isValidBST(self, root: 'TreeNode') -> 'bool':
        if root is None:
            return True
        stack = []
        maximum = -2147483649
        while stack or root:
            while root and root.val != None:
                stack.append(root)
                root = root.left
            root = stack.pop()
            if root.val is None:
                continue
            if root.val <= maximum:
                return False
            maximum = root.val
            root = root.right
        return True

參考博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章