题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5
/ \
2 6
/ \
1 3
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true
来源:力扣(LeetCode)
链接:戳着
分析
BST中,按权值比较,左孩子 < 根节点 < 右孩子。
而二叉树的后序遍历序列的顺序是:左孩子 右孩子 根节点
根据后序遍历序列判断该树是否存在:只需要看权值是否满足 左孩子 < 根节点 < 右孩子。
步骤:
① 找到左右子树的分界点(根节点位于数组的最后,左子树都小于根节点,右子树都大于根结点)。
②判断左(右)子树是否严格小(大)于根节点。
③递归判断左右子树是否合法。
代码
static class Solution {
public boolean verifyPostorder(int[] postorder) {
return verify(postorder, 0, postorder.length - 1);
}
public boolean verify(int[] subpostorder, int l, int r) {
if (l >= r)
return true;
int i = l, m = 0;
// 寻找左右孩子分界点,并同时判断是否都大于(小于)根节点
while (i < r && subpostorder[i] < subpostorder[r]) {
i++;
}
m = i; // m记录分界点
for (; i < r; i++) {
if (subpostorder[i] < subpostorder[r]) {
return false;
}
}
// 若只有左孩子
if (m == r)
return verify(subpostorder, l, m - 1);
// 若只有右孩子
if (m == l)
return verify(subpostorder, m, r - 1);
// 左右孩子均有
return verify(subpostorder, l, m - 1)
&& verify(subpostorder, m, r - 1);
}
}