题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。。
分析
二叉搜索树:对二叉搜索树任意节点而言,左子树的值都小于该节点的值,右子树的值都大于该节点的值。
二叉树的遍历:
先序遍历:“先”代表先遍历根节点。节点遍历顺序为:根节点,左孩子,右孩子,简称“根左右”,或者“中左右”
中序遍历:“中“代表根节点在中间遍历。节点遍历顺序为:左孩子,根节点,右孩子,简称”左根右“,或者”左中右“
后序遍历:”后“代表根节点在最后遍历。节点遍历顺序为:左孩子,右孩子,根节点,简称”左右根“,或者”左右中“
涉及到树的算法题一般都用递归
根据上述概念可知,如果一个数组是二叉搜索树的后序遍历,那么数组的最后一位是二叉搜索树的根节点,数组中除最后一位外的剩余部分中前一部分比根节点小,后一部分比根节点大。前一部分和后一部分又都是二叉搜索树。所以可以用递归的方式判断一个数组是否为二叉搜索树的后序遍历。
代码实现(Java)
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 i = start;
for (; i < end; i++) if (sequence[i] > sequence[end]) break;
for (int j = i; j < end; j++) if (sequence[j] < sequence[end]) return false;
return isBST(sequence, start, i - 1) && isBST(sequence, i, end - 1);
}
注:题目及解法均来源于牛客网–剑指offer