二叉树的后序遍历序列

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

分析:二叉搜索树的特点,左子树的值一定小于根结点,右子树上的值一定大于根结点;
后序遍历:左右中,所以根结点一定位于数组的最后
以根结点的值为依据,先遍历出数组前面小于root值的节点,为root的左子树的值,再从该点出发遍历到root之前的值,若没有小于root的值,则对左右子树再进行递归。

//引入Arrays.copyOfRange(int[] A,int a,int b);从a到b的索引取出作为一个新的数组
import java.util.Arrays;

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {

        if(sequence==null||sequence.length<=0)
            return false;

        int root=sequence[sequence.length-1];
        int i=0;
        //-1 不算入root节点
        while(i<sequence.length-1){
            if(sequence[i]>root){
                break;
            }
            i++;
        }

        for(int j=i;j<sequence.length-1;j++){
            if(sequence[j]<root){
                return false;
            }
        }
        //int[] sequence1=Arrays.copyOfRange(sequence,0,i-1);
        //int[] sequence2=Arrays.copyOfRange(sequence,i,sequence.length-2);
        boolean left=true;
        //此处原本设置的判断条件为i>0,可是会导致每次Arrays.copyOfRange一直在缩小sequence的长度,直到缩小到null,
        //会时left会调用VerifySquenceOfBST,执行第五行代码,然后返回值为false,设置为1就不会再出现这样的问题
        //其实可以发现,只要sequence的元素个数在1-3个之间都会返回true
        if(i>1)
            left=VerifySquenceOfBST(Arrays.copyOfRange(sequence,0,i-1));

        boolean right=true;
        if(i<sequence.length-1)
            right=VerifySquenceOfBST(Arrays.copyOfRange(sequence,i,sequence.length-2));

        return (left&&right);
    }
}
全部评论

相关推荐

都送什么礼物吗?如果送的话,价格大概都是多少?辛苦大家给个参考啦!
牛客73617529...:要送就送那种没必要买又很贵的,假设一个打瓦的显示屏 鼠标 键盘都很贵,你送这些突出不了价值,直接送一个很贵的鼠标垫包记住你的。
点赞 评论 收藏
分享
机械打工仔:我来告诉你原因,是因为sobb有在线简历,有些HR为了快会直接先看在线简历,初步感觉不合适就不会找你要详细的了
投了多少份简历才上岸
点赞 评论 收藏
分享
07-29 13:49
深圳大学 运营
字节我爱你
JamesGosli...:秋招还是实习啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务