题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。假设输入数组的任意两个数组都不相同。
答案:
采用递归的思路。
1.根据后序遍历规则,数组的最后一个元素,即为头结点
2.那么数组里从头到尾遍历,前面小于的头结点的值,位于树的左子树,后面大于的头结点的值,位于树的右子树。
3.找到这个将数组一分为二的位置,然后分别判断左右子树是否是二叉搜索树。
public boolean isBST(int[] array) {
if (array == null || array.length == 0) {
return false;
}
return isBST(array, 0, array.length - 1);
}
public boolean isBST(int[] array, int start, int end) {
//终止条件,一个节点时,肯定是二叉搜索时,直接返回true
if (start == end) {
return true;
}
//根据后序遍历规则,数组的最后一个元素,即为头结点
int headValue = array[end];
//遍历数组 由于是二叉搜索树,数组前面小于头结点的值,是树的左子树,大于头结点的值,是树的右子树
int i;
for (i = start; i < end; i++) {
if (array[i] > headValue) {
break;
}
}
//找到第一个大于头结点的值后,将数组一分为二,理应后面的元素应均大于头结点,若有元素小于头结点,则说明该树不是二叉搜索树
for (int j = i; j < end; j++) {
if (array[j] < headValue) {
return false;
}
}
//将数组顺利一分为二后,判断左右子树,是否均是二叉搜索树
return isBST(array, start, i - 1) && isBST(array, i, end - 1);
}