给一个数组,然后判断数组是不是一个二叉搜索树的后序遍历序列
二叉搜索树:左子节点小于根节点,右子节点大于根节点
后序遍历:左右根 先打印左子节点,在右子节点,然后根节点。
思路和代码
思路写在代码的注释里面了。
package practice;
/**
* @author iu
* 二叉搜索树的后序遍历序列
* 给一个序列判断是不是某人二叉搜索树的后序遍序列
* 递归
* 最后一位数是根节点,二叉搜索树的左子节点小于根节点,右子节点大于根节点。
* 所以找到左右子树的边界,然后判断右子数是否全大于根节点,如果右子树的所有节点中有一个小于根节点直接返回false
* 对于左子树来说,最后一位也是根节点。所以按照上面的步骤继续找到左右的边界,然后把根节点和右子节点比较。
* 直到划分的左子树只有一个子节点的时候就停止递归并且返回true
*/
public class VerifyArrayOfBST{
public static boolean verifyArrayOfBST(int[] array, int start, int length) {
//反正传的是空数组
if (array == null) {
return false;
}
//找到根节点的值
int headValue = array[length - 1];
int i = start;
//得到左子树的范围
for (; i < length - 1; i++) {
if (array[i] > headValue) {
break;
}
}
int j = i;
//判断右子树的元素有没有小于根节点的元素,有直接返回false
for (; j < length - 1; j++ ) {
if (array[j] < headValue) {
return false;
}
}
//开始递归 使用left 和 right 获取返回的值
boolean left = true;
boolean right = true;
//如果左子树的元素小于2个元素时停止判断
if (i - start > 1) {
//传入递归的开始位置和数组长度
left = verifyArrayOfBST(array, 0, i);
}
//如果右子树的元素小于2个元素时停止判断
if (length - i > 1) {
//传入递归的开始位置和数组长度
right = verifyArrayOfBST(array, i,length - 1);
}
return left&&right;
}
public static void main(String[] args) {
int[] array = {5,7,6,9,11,10,8};
System.out.println(verifyArrayOfBST(array,0, array.length));
}
}