二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列
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; } }