最近一直在复习一些算法及数据结构方面的东西,就找了一个适合找工作笔试的题目,在剑指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 + "]"; } }