剑指offer上的第24题,主要考察递归思想,九度OJ上AC。
题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
输入:
每个测试案例包括2行:
第一行为1个整数n(1<=n<=10000),表示数组的长度。
第二行包含n个整数,表示这个数组,数组中的数的范围是[0,100000000]。
输出:
对应每个测试案例,如果输入数组是某二叉搜索树的后序遍历的结果输出Yes,否则输出No。
样例输入:
7
5 7 6 9 11 10 8
4
7 4 6 5
样例输出:
Yes
No
代码:
package JvavaDataTest;
public class SolutionTree {
public static void main(String[] args) {
SolutionTree st = new SolutionTree();
int a[] = {3,6,5,11,13,12,8};
System.out.println(a.length);
boolean bl = st.isBST(a);
System.out.println(bl);
}
public boolean isBST(int [] seq){
int len = seq.length;
if(len > 0){
return isBST(seq,0,len-1);
}else{
return false;
}
}
public boolean isBST(int []seq,int start,int end){
if(start >= end){
return true;
}
int inx = seq[end];
int m =start;
for(int i =end -1;i>=start;i--){
if(seq[i] < inx){
//找到了左子树和右子树的分界点
m = i;
break;
}
if(i == start){
m = -1;
}
}
//分界前的数据都小于根节点
for(int i =start;i <= m;i++){
if(i <= m && seq[i] >inx){
return false;
}
}
//分界后的数据都大于根节点
for(int i = m+1;i <end ;i++){
if(i<end && seq[i] < inx){
return false;
}
}
//递归一下左子树和右子树
return isBST(seq,start,m) && isBST(seq,m+1,end-1);
}
}
class TreeNoder{
int val = 0;
TreeNoder treeNoderLeft = null;
TreeNoder treeNoderRight = null;
public TreeNoder(int val){
this.val = val;
}
}
结果: