题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。
后序遍历是左右根,
思路
二叉树后序遍历数组的最后一个数为根结点,剩余数字中,小于根结点的数字(即左子树部分)都排在前面,
大于根结点的数字(即右子树部分)都排在后面。根据遍历数组的这个特性,可以编写出一个递归函数,
用于实现题目所要求的判断功能。
package helen.a;
public class SquenceOfBST {
public boolean squenceOfBST(int a[]){
if(a==null||a.length==0){
return false;
}
return verifyCore(a,0,a.length-1);
}
private boolean verifyCore(int[] a, int start, int end) {
// 4, 8, 6, 12, 16, 14, 10
//start大于end说明上层没有左子树或右子树
if(start>=end){
return true;
}
int mid=start;
while(a[mid]<a[end]){
mid++;
}
for(int i=mid;i<end;i++){
if(a[i]<a[end]){
return false;
}
}
return verifyCore(a,start,mid-1)&&verifyCore(a,mid,end-1);
} // ====================测试代码====================
void test(String testName, int sequence[], boolean expected){
if(testName != null)
System.out.printf("%s begins: ", testName);
if(squenceOfBST(sequence) == expected)
System.out.printf("passed.\n");
else
System.out.printf("failed.\n");
}
// 10
// / \
// 6 14
// /\ /\
// 4 8 12 16
void test1(){
int data[] = {4, 8, 6, 12, 16, 14, 10};
test("Test1", data, true);
}
// 5
// / \
// 4 7
// /
// 6
void test2(){
int data[] = {4, 6, 7, 5};
test("Test2", data, true);
}
//
// // 5
/
4
/
3
/
2
/
1
void test3(){
int data[] = {1, 2, 3, 4, 5};
test("Test3", data, true);
}
//
// 1
\
2
\
3
\
4
\
5
void test4(){
int data[] = {5, 4, 3, 2, 1};
test("Test4", data, true);
}
//
// // 树中只有1个结点
void test5(){
int data[] = {5};
test("Test5", data, true);
}
//
void test6(){
int data[] = {7, 4, 6, 5};
test("Test6", data, false);
}
//
void test7(){
int data[] = {4, 6, 12, 8, 16, 14, 10};
test("Test7", data, false);
}
//
void test8(){
test("Test8", null, false);
}
public static void main(String args[]){
// new SquenceOfBST().test1();
// new SquenceOfBST().test2();
new SquenceOfBST().test3();
new SquenceOfBST().test4();
new SquenceOfBST().test5();
new SquenceOfBST().test6();
new SquenceOfBST().test7();
new SquenceOfBST().test8();
}
}