255. Verify Preorder Sequence in Binary Search Tree
255. Verify Preorder Sequence in Binary Search Tree
遞迴(超時)
想法是把第一個元素當作根節點,接著從第二個元素開始,把所有小於根節點的元素都放在 left ,接著把所有比根節點大的元素放在 right ,這裡有一個剪枝是如果說有元素比根節點小,那就不滿足 Binary Seacth Tree 的定義,直接回傳 False 。
接著將左邊與右邊繼續遞迴的判斷。
class Solution:
    def verifyPreorder(self, preorder: List[int]) -> bool:
        if not preorder:
            return True
        root = preorder[0]
        left = []
        right = []
        i = 1
        while i < len(preorder):
            if preorder[i] < root:
                left.append(preorder[i])
            else:
                break
            i += 1
        while i < len(preorder):
            if preorder[i] > root:
                right.append(preorder[i])
            else:
                return False
            i += 1
        return self.verifyPreorder(left) and self.verifyPreorder(right)
這個解法可以進而簡化成,只要傳遞索引即可。
class Solution:
    def verifyPreorder(self, preorder: List[int]) -> bool:        
        def helper(left, right):
            if left >= right:
                return True
            root = preorder[left]
            i = left + 1
            while i <= right and preorder[i] < root:
                i+=1
            j = i
            while j <= right:
                if preorder[j] <= root:
                    return False
                j += 1
            return helper(left+1, i-1) and helper(i, right)
        return helper(0, len(preorder) - 1)
這樣的時間複雜度是 $$O(NlogN)$$ ,最糟的情況很有可能所有的元素都是左子樹,甚至可以到 $$O(N^2)$$ 或是 $$O(N!)$$ 。
這題有不超時的辦法,不過我看了很多文章以及別人的講解,技巧性過強,我決定這個題目就到這裡為止。