二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列
http://www.nowcoder.com/questionTerminal/a861533d45854474ac791d90e447bafd
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)
示例1
输入: [4,8,6,12,16,14,10] 返回值: true
运行时间:12ms(超过79.33%)
占用内存:9652kb(超过70.29%)
直接上代码:
import java.util.*;
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
//BST的中序遍历的结果是一个递增的序列
//思路:反证法,假设该序列是一个BST,则其中序遍历为一个递增序列。
//然后根据中序遍历和后序遍历建立二叉树,看能不能成树,如果能则说明是BST,反之则不是
int len = sequence.length;
if(len == 0){//约定空树不是BST
return false;
}
int[] postSeq = new int[len];
for(int i =0; i < len; i++){
postSeq[i] = sequence[i];
}
Arrays.sort(sequence);//中序遍历
return method(postSeq,sequence);
}
public boolean method(int[] post, int[] inorder){
int len = post.length;
if(len != inorder.length){
return false;
}
else if(len == 0){
return true;
}
else if(len == 1){
if(post[0] != inorder[0]){
return false;
}
else{
return true;
}
}
int root = post[len-1];
int index = findIndex(inorder, root);
if(index == -1)return false;//如果在中序遍历中找到根结点,则说明无法成树
int[] preLeftList = Arrays.copyOfRange(post,0,index);
int[] inorderLeftList = Arrays.copyOfRange(inorder,0, index);
int[] preRightList = Arrays.copyOfRange(post, index,len-1);
int[] inorderRightList = Arrays.copyOfRange(inorder,index+1,len);
return method(preLeftList,inorderLeftList)&&method(preRightList,inorderRightList);
}
public int findIndex(int[] inorder, int a){
for(int i = 0; i < inorder.length; i++){
if(a==inorder[i])return i;
}
return -1;
}
} 
