最近一直在复习一些算法及数据结构方面的东西,就找了一个适合找工作笔试的题目,在剑指Offer上刷了几道题目,发现对复习知识点还是很有用的,推荐要找工作的伙伴去剑指Offer刷题。
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
看到这道题,给出了二叉排序树(bst)的后序遍历数组,根据二叉排序树的特点,可以知道,中序遍历肯定是按从小到大的顺序排列的,所以我就直接,先对数组进行冒泡排序(当然其他排序都行,只要不超时就行了,不过剑指Offer的数据量还是比较小的,可以忽略),排序之后其实就是对应的中序序列,根据中序和后序序列构造出二叉树,然后遍历这课二叉树看是否等于你排序的结果,也就是中序遍历的结果,这是最直接的求法,之前在前面的博客 剑指Offer-重建二叉树 中写过根据前序和中序,来构建二叉树,其实都是一样的性质,找到根节点就行了。
代码如下:
import java.util.ArrayList;
import java.util.List;
public class Solution {
int lists[] = new int[1024];
int z = 0 ;
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length <= 0){
return false;
}
int t[] = new int[sequence.length];
System.arraycopy(sequence, 0, t, 0, sequence.length);
for(int i = 0 ; i < sequence.length - 1; i ++){
for(int j = 0 ; j < sequence.length - 1 - i ; j ++){
if(sequence[j] > sequence[j+1]){
int temp = sequence[j];
sequence[j] = sequence[j+1];
sequence[j+1] = temp;
}
}
}
TreeNodes treeNode = Recusion(sequence,0,sequence.length-1,t,0,t.length-1);
// System.out.println(treeNode);
midForEach(treeNode);
if(z != sequence.length ) {
return false;
}
for(int i = 0 ; i < sequence.length ; i ++) {
if(sequence[i] != lists[i]) {
return false;
}
// System.out.println(sequence[i] + " : " + lists[i]);
}
return true;
}
public TreeNodes Recusion(int []mid , int startMid , int endMid , int []aft, int startAft , int endAft){
TreeNodes treeNode = null;
if(startMid > endMid || startAft > endAft){
return treeNode;
}
for(int i = startMid ; i <= endMid ; i ++){
if(mid[i] == aft[endAft]){
treeNode = new TreeNodes(aft[endAft]);
treeNode.left = Recusion(mid,startMid,i-1,aft,startAft,startAft+i-startMid-1);
treeNode.right = Recusion(mid,i+1,endMid,aft,startAft+i-startMid,endAft-1);
break;
}
}
return treeNode;
}
public void midForEach(TreeNodes treeNode) {
if(treeNode != null) {
midForEach(treeNode.left);
// System.out.print(treeNode.val + " ");
// lists.add(treeNode.val);
lists[z++] = treeNode.val;
midForEach(treeNode.right);
}
}
}
class TreeNodes{
int val;
TreeNodes left;
TreeNodes right;
TreeNodes(int val){
this.val = val;
}
@Override
public String toString() {
return "TreeNodes [val=" + val + ", left=" + left + ", right=" + right + "]";
}
}
剑指Offer的jdk说是1.8的,但是我在本地运行没有任何问题,提交上去就卡到一个数据过不了,测试都没问题,改正代码如上。