基本知识:
1)BST:二叉排序树,即父节点大于左子节点,小于等于右子节点
2)后序遍历: 先遍历左子树,再遍历右子树,最后遍历根节点
基本思想:后续遍历得到的数组的最后一个元素为根节点,前一部分为左子树,后一部分为右子树
前一部分中的元素都小于root(根),后一部分中的元素都大于root(根)
所以可以先遍历前一部分,找到第一个大于等于root的节点i,然后判断此后的节点是否都大于root,如果不是就不是后序遍历的结果,
如果是,则递归调用。
本文参考如下博客: 博客1
package test;
public class BinarySortedTree {
private boolean isBST(int[] array,int start,int end){
int root = array[end]; //数组序列的最后一个元素为二叉排序树的根节点
int i = start;
boolean lResult = true;
boolean rResult = true;
if(array == null)
throw new NullPointerException();
if(end-start < 0)
return false;
//找到节点i,i-1为根节点的左孩子,i及其以后的节点为根节点的右孩子
for(;i < end;i++)
if(array[i] > root)
break;
for(int j = i;j < end;j++){
if(array[j] < root)
return false;
}
//递归调用左子树
if(i > start)
lResult = isBST(array,start,i-1);
//递归调用右子树
if(i < end)
rResult = isBST(array,i,end-1);
return (lResult&&rResult);
}
public static void main(String[] args) {
// 7
// 5 9
// 4 3 8 10
//后序遍历为:4 3 5 8 10 9 7
int[] arrayBST = {4,3,5,8,10,9,7}; //是后序遍历的结果
int [] arrayNotBST = {4,9,5,8,10,3,7}; //不是后序遍历的结果
BinarySortedTree bst = new BinarySortedTree();
System.out.println("序列arrayBST "+(bst.isBST(arrayBST, 0, arrayBST.length-1)==true?"是":"不是")+"后序遍历的结果");
System.out.println("序列arrayNotBST "+(bst.isBST(arrayNotBST, 0, arrayNotBST.length-1)==true?"是":"不是")+"后序遍历的结果");
}
}