📜  门| GATE-CS-2003 |问题1(1)

📅  最后修改于: 2023-12-03 15:28:41.854000             🧑  作者: Mango

门| GATE-CS-2003 |问题1

题目描述

给定一个$n$元素的序列$A$,写一个函数判断序列是否为二叉查找树的后序遍历。

示例

输入

A = [1, 3, 2, 5, 7, 6, 4]

输出

True
解题思路

二叉查找树的后序遍历具有以下性质:

  1. 序列的最后一个元素为根节点;
  2. 序列可分为两个部分,前一部分所有元素小于根节点,后一部分所有元素大于根节点;
  3. 递归地判断前一部分和后一部分是否为后序遍历。

我们可以根据上述性质进行递归实现,具体实现过程详见代码。

代码实现
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)$的额外空间。