码迷,mamicode.com
首页 > 其他好文 > 详细

[剑指offer] 判断二叉搜索树的后序遍历序列

时间:2016-05-17 11:39:23      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

输入描述

整数数组

输出描述

布尔值

题目分析

什么是二叉搜索树?

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

分析:

BST的后序遍历的合法序列满足:

对于一个序列S,最后一个元素是根元素,假设为x;
如果去掉根元素剩下的序列为T,那么T满足:前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)也是合法的后序序列。

解法一  运行时间:32ms 占用内存:503k 

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence==null || sequence.length==0) return false;
        return IsTreeOfBST(sequence,0,sequence.length-1);
    }
public boolean IsTreeOfBST(int [] sequence,int start,int end){     //子数组为空
        if(end<=start) return true;

        int i=0;
        for(;i<end;i++){//找到左右子树分割点
            if(sequence[i]>sequence[end]) break;
        }
        for(int j=i;j<end;j++){
            if(sequence[j]<sequence[end]) return false;
        }
        //递归
return IsTreeOfBST(sequence,0,i-1)&&IsTreeOfBST(sequence,i,end-1);
    }
}

  采用递归的思想,先找出根节点,左子树元素都必须比根节点小,右子树节点都比根节点大,否则返回false.

得到子树(子序列)的两种方法: 

①用下标把数组 逻辑分为几个子数组(这里采用的是这种)

②用工具类Arrays把数组分割

解法二  运行时间:38ms 占用内存:654k

import java.util.Arrays;
public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        int len = sequence.length;
        if(sequence==null || len==0) return false;

        int i=0;
        for(;i<len-1;i++){//寻找左右子树分界点
            if(sequence[i]>sequence[len-1]) break;
        }
        for(int j=i;j<len-1;j++){
            if(sequence[j]<sequence[len-1]) return false;
        }

        boolean left=true;//左右子树标志,默认为true
        boolean right=true;

        if(i>0){//判断是否还有左子树
left = VerifySquenceOfBST(Arrays.copyOfRange(sequence,0,i));
        }
        if(i<len-1){//判断是否还有右子树
right = VerifySquenceOfBST(Arrays.copyOfRange(sequence,i,len-1));
        }

        return left&&right;//返回递归结果
    }

}

  思路还是和解法一相同,只是用工具类Arrays把数组分割,效率比解法一慢一些。

[剑指offer] 判断二叉搜索树的后序遍历序列

标签:

原文地址:http://blog.csdn.net/amazing7/article/details/51433832

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!