33. 二叉搜索树的后序遍历序列【分治 递归】
1. 问题
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5
/ \
2 6
/ \
1 3示例 1:
输入: [1,6,3,2,5]
输出: false示例 2:
输入: [1,3,2,6,5]
输出: true提示:
数组长度 <= 1000
2. 解法 - 分治 递归
一棵二叉搜索树是一棵有根二叉树并且对于所有结点满足特殊的性质:对于树中任意一个结点,它的权值必然大于等于所有左子树结点的权值,小于等于所有右子树结点的权值。
二叉搜索树的左、右子树也分别为二叉搜索树。
2.1 Java
2.2 Kotlin
2.3 复杂度分析
时间复杂度
O(N^2):每次递归调用recursion就能揪出一个根节点,总共有 N 个结点,因此递归需要占用O(N)。最差情况下,当树退化成为链表,每轮递归都需要遍历树种所有的结点,占用O(N)。所以总的时间复杂度为O(N^2)。空间复杂度
O(N):最差情况下,当树退化成为链表,递归深度将达到 N。
3. 参考
4. 标签
树
栈
分治
递归
最后更新于
这有帮助吗?