Skip to content

Latest commit

 

History

History
93 lines (65 loc) · 2.52 KB

判断二叉搜索树的后序遍历序列.md

File metadata and controls

93 lines (65 loc) · 2.52 KB

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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把数组分割,效率比解法一慢一些。