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!)$$ 。

這題有不超時的辦法,不過我看了很多文章以及別人的講解,技巧性過強,我決定這個題目就到這裡為止。