二叉搜索树的后序遍历序列

二叉搜索树的后序遍历序列

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;
    }
}
全部评论

相关推荐

最近和朋友聊天,她说了句让我震惊的话:"我发现我连周末点外卖都开始'最优解'了,一定要赶在高峰期前下单,不然就觉得自己亏了。"这不就是典型的"班味入侵"吗?工作思维已经渗透到生活的方方面面。
小型域名服务器:啊?我一直都这样啊?我还以为是我爱贪小便宜呢?每次去实验室都得接一杯免费的开水回去,出门都得规划一下最短路径,在宿舍就吃南边的食堂,在实验室就吃北边的食堂,快递只有顺路的时候才取。
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务