📅  最后修改于: 2023-12-03 15:28:41.854000             🧑  作者: Mango
给定一个$n$元素的序列$A$,写一个函数判断序列是否为二叉查找树的后序遍历。
输入
A = [1, 3, 2, 5, 7, 6, 4]
输出
True
二叉查找树的后序遍历具有以下性质:
我们可以根据上述性质进行递归实现,具体实现过程详见代码。
def is_bst_postorder(postorder):
if not postorder:
return True
root = postorder[-1]
split_idx = 0
while split_idx < len(postorder) and postorder[split_idx] < root:
split_idx += 1
for i in range(split_idx, len(postorder)-1):
if postorder[i] < root:
return False
return is_bst_postorder(postorder[:split_idx]) and is_bst_postorder(postorder[split_idx:-1])
时间复杂度:$O(n^2)$。
最坏情况下(当序列为一个单向链表时),每递归一次需要检查$O(n)$个元素。
空间复杂度:$O(n)$。
递归栈的深度最大为$n$,需要$O(n)$的额外空间。