LeetCode | 面試題33. 二叉搜索樹的後序遍歷序列【劍指Offer】【Python】

LeetCode 面試題33. 二叉搜索樹的後序遍歷序列【劍指Offer】【Medium】【Python】【遞歸】

問題

力扣

輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷結果。如果是則返回 true,否則返回 false。假設輸入的數組的任意兩個數字都互不相同。

參考以下這顆二叉搜索樹:

     5
    / \
   2   6
  / \
 1   3

示例 1:

輸入: [1,6,3,2,5]
輸出: false

示例 2:

輸入: [1,3,2,6,5]
輸出: true

提示:

  1. 數組長度 <= 1000

思路

遞歸

根據性質:
1. 後序遍歷:左右根
2. 二叉搜索樹:左子樹任意節點的值 < 根節點的值,右子樹任意節點的值 > 根節點的值

劃分左右子樹,分別判斷子樹是否滿足二叉搜索樹性質。

其他看代碼註釋。

時間複雜度: O(n^2),n 爲節點個數。
空間複雜度: O(n),n 爲節點個數。

Python3代碼
from typing import List

class Solution:
    def verifyPostorder(self, postorder: List[int]) -> bool:
        def recur(i, j):
            # 根節點小於等於1個
            if i >= j:
                return True
            l = i
            # 左子樹
            while postorder[l] < postorder[j]:
                l += 1
            # 找到第一個大於根節點的節點,記爲 m
            m = l
            # 右子樹
            while postorder[l] > postorder[j]:
                l += 1
            # postorder[j]是根
            return l == j and recur(i, m - 1) and recur(m, j - 1)
        
        return recur(0, len(postorder) - 1)

GitHub鏈接

Python

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