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. 二叉搜索樹:左子樹任意節(jié)點的值 < 根節(jié)點的值,右子樹任意節(jié)點的值 > 根節(jié)點的值

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

其他看代碼注釋。

時間復雜度: O(n^2),n 為節(jié)點個數。
空間復雜度: O(n),n 為節(jié)點個數。

Python3代碼
from typing import List

class Solution:
    def verifyPostorder(self, postorder: List[int]) -> bool:
        def recur(i, j):
            # 根節(jié)點小于等于1個
            if i >= j:
                return True
            l = i
            # 左子樹
            while postorder[l] < postorder[j]:
                l += 1
            # 找到第一個大于根節(jié)點的節(jié)點,記為 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

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容