[名企面试知识点][Java]判断二叉搜索树的后序遍历序列
发布于 2017-03-10 14:01 2429 次浏览 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把数组分割,效率比解法一慢一些。

添加回复
回到顶部