题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路
由于二叉搜索树的特点,每一个结点的左孩子一定小于当前结点,右孩子一定大于当前结点。
同时树的后序遍历中,根结点一定是在序列尾部。
此时我们就可以使用递归的思想分而治之,只需要找到左右子树的分界点,即左侧连续小于根节点的子序列是左子树的后序遍历;右侧连续大于根节点的子序列是右子树的后序遍历。
一旦左右子树的后序遍历序列有不符合二叉搜索树特点的结点,就表示该序列不是一个二叉搜索树的后序遍历结果。
也就是说,我们只需要遍历获取一个大于根结点的一个结点,然后判断自此开始的子序列中是否存在小于根节点的结点(存在则表示乱序,非二叉搜索树),然后递归判断左右子树是否是一个二叉搜索树即可。
代码实现
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if (sequence == null || sequence.length == 0) {
return false;
}
return isBST(sequence, 0, sequence.length - 1);
}
private boolean isBST(int[] sequence, int start, int end) {
if (start >= end) {
return true;
}
int root= sequence[end];
int midIndex = start;
int loop = start;
while (start < end && sequence[midIndex] < root) {
midIndex++;
}
for (loop = midIndex ; loop < end ; loop++) {
if (sequence[loop] < root) {
return false;
}
}
return isBST(sequence, start, midIndex - 1) && isBST(sequence, midIndex, end - 1);
}
}