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
提示:
數組長度 <= 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)