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

来源:互联网 发布:asp开源cms 编辑:程序博客网 时间:2024/06/08 09:24

题目描述

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

解析

链接:https://www.nowcoder.com/questionTerminal/a861533d45854474ac791d90e447bafd
来源:牛客网

BST的后序序列的合法序列是,对于一个序列S,最后一个元素是x
(也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段(子树)都是合法的后序序列。完美的递归定义 。

非递归

public class Solution {    public boolean VerifySquenceOfBST(int [] sequence) {        if(sequence==null)return false;        int size = sequence.length;        if(0==size)return false;        int i = 0;        while((--size)>0)        {            while(sequence[i]<sequence[size]){i++;}            while(sequence[i]>sequence[size]){i++;}             //如果 i==size,说明最后一个数刚好把数组分成两个部分,一个全比它大,一个全比它小            if(i<size)return false;            i=0;        }        return true;    }}

递归版本

链接:https://www.nowcoder.com/questionTerminal/a861533d45854474ac791d90e447bafd来源:牛客网public class Solution {    public boolean VerifySquenceOfBST(int [] sequence) {        if(sequence.length==0)            return false;        if(sequence.length==1)            return true;        return ju(sequence, 0, sequence.length-1);    }    public boolean ju(int[] a,int star,int root){        if(star>=root)            return true;        int i = root;        //从后面开始找        while(i>star&&a[i-1]>a[root])            i--;//找到比根小的坐标        //从前面开始找 star到i-1应该比根小        for(int j = star;j<i-1;j++)            if(a[j]>a[root])                return false;;        return ju(a,star,i-1)&&ju(a, i, root-1);    }}
原创粉丝点击