返回

揭秘剑指 Offer 33: 二叉搜索树的后序遍历序列 | 刷题技巧大揭秘

前端

题目背景

题目链接: 剑指 Offer 33. 二叉搜索树的后序遍历序列

题目

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。

如果该数组是某二叉搜索树的后序遍历结果,返回 true;否则返回 false。

示例:

输入:[4, 8, 6, 12, 16, 14, 10]
输出:true

输入:[4, 6, 7, 5]
输出:false

解题思路

这道题考察的是二叉搜索树的后序遍历序列的性质。后序遍历的定义是:

[ 左子树 | 右子树 | 根节点 ]

即遍历顺序为 “左、右、根” 。

二叉搜索树的定义是:

  • 左子树中所有节点的值小于根节点,
  • 右子树中所有节点的值大于根节点。

因此,我们可以根据这些性质来判断一个数组是不是二叉搜索树的后序遍历结果。

1. 先找到根节点

根节点是二叉搜索树中最大的值。因此,我们可以先找到数组中最大的值,将其作为根节点。

2. 然后判断左子树和右子树是否满足二叉搜索树的性质

  • 左子树中所有节点的值都小于根节点。
  • 右子树中所有节点的值都大于根节点。

如果满足,则该数组是二叉搜索树的后序遍历结果,否则不是。

3. 如何找到根节点

我们可以使用一个栈来实现。

  • 首先,将数组中的所有元素压入栈中。
  • 然后,弹出栈顶元素,将其作为根节点。
  • 接着,判断栈中剩余的元素是否满足二叉搜索树的性质。
  • 如果满足,则该数组是二叉搜索树的后序遍历结果,否则不是。

示例代码

def verify_postorder(postorder):
    stack = []
    root = None
    for x in postorder:
        if root is None:
            root = x
        elif x < stack[-1]:
            return False
        while stack and x > stack[-1]:
            root = stack.pop()
        stack.append(x)
    return True

总结

这道题的解题思路并不复杂,但需要对二叉搜索树的后序遍历序列的性质有充分的理解。

希望这篇文章能帮助您轻松理解这道题。如果您还有其他问题,欢迎留言讨论。