剑指Offer【二叉搜索树的后序遍历序列】
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true
,否则返回 false
。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
1 |
|
示例 1:
1 |
|
示例 2:
1 |
|
提示:
数组长度 <= 1000
解法
- 递归判断
- 后序遍历定义: [ 左子树 | 右子树 | 根节点 ] ,即遍历顺序为 “左、右、根” 。
- 二叉搜索树定义: 左子树中所有节点的值 < 根节点的值;右子树中所有节点的值 > 根节点的值;其左、右子树也分别为二叉搜索树。
- 划分左右子树:遍历后序遍历的
[i,j]
区间元素,寻找第一个大于根节点 的节点,索引记为m 。此时,可划分出左子树区间[i,m−1]
、右子树区间[m,j−1]
根节点索引j
。 - 左子树区间:
[i,m−1]
内的所有节点都应 <postorder[j]
。而划分左右子树 步骤已经保证左子树区间的正确性,因此只需要判断右子树区间即可。 - 右子树区间:
[m,j−1]
内的所有节点都应 >postorder[j]
。实现方式为遍历,当遇到<=postorder[j]
的节点则跳出,后续则可通过 p = j判断是否为二叉搜索树。(p为遍历的指针) - 递归终止条件:
i>=j
- 划分左右子树:遍历后序遍历的
1 |
|
- 时间复杂度:O(n^2)
来源:力扣(LeetCode)
链接:剑指 Offer 33. 二叉搜索树的后序遍历序列 - 力扣(LeetCode)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 漫漫长夜!