牛客_二叉搜索树的后序遍历序列

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangvalue/article/details/87905372

题目描述

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

补充:

二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

(4)没有键值相等的节点

思路:

采用分治法的思想,找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。

由题意可得:

1. 后序遍历序列的最后一个元素为二叉树的根节点;

2. 二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根结点。

算法步骤如下:

1. 找到根结点;

2. 遍历序列,找到第一个大于等于根结点的元素i,则i左侧为左子树、i右侧为右子树;

3. 我们已经知道i左侧所有元素均小于根结点,那么再依次遍历右侧,看是否所有元素均大于根结点;若出现小于根结点的元素,则直接返回false;若右侧全都大于根结点,则:

4. 分别递归判断左/右子序列是否为后序序列;

其中在判断start<=end的时候是都需要判断

 1️⃣取到start==end时说明剩下的元素为1个,肯定是符合后序遍历,就直接返回true

 2️⃣须判断start>end的情况,这种情况是没有左子树,只有根节点和一个右节点(只有两个元素)的情况,此时再递归左子树的时候,此时传入的end=start-1,此时的因为之前已经判断了右子树符合条件,此时就直接返回true

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        //首先判断是否为空
        if(sequence.length==0){return false;}
        //当为只有一个元素的时候直接返回true
        //if(sequence.length==1){return true;}       
        return VerifySquenceOfBST(sequence,0,sequence.length-1);
    }
    public boolean VerifySquenceOfBST(int [] sequence,int start,int end ) {
        //取到start==end时说明剩下的元素为1个,肯定是符合后序遍历
        //可是必须判断start>end的情况,这种情况是没有左子树的情况,
        //在递归左子树的时候,此时传入的end=start-1
        if(start>=end){return true;}
        //取到end处的元素,该元素为根节点
        int root= sequence[end];
        int i=0;
        //从左向右开始找到第一个比根节点的元素大的位置i,在i的左边即为根节点的左子树(因为题目中给成输入数组互不相同)
        while(sequence[i]<root&&i<end){
            i++;
        }
        //此时再判断在i的右边是不是都比root大,若不符合直接返回false,另从j开始
        int j=i;
        while(j<end){
             if(sequence[j]<root){
                return false;
            }
            j++;
        }
        //递归左子树
        boolean left =VerifySquenceOfBST(sequence,start,i-1);
        //递归右子树
        boolean right =VerifySquenceOfBST(sequence,i,end-1);
            return left&right;
        
    }
}

猜你喜欢

转载自blog.csdn.net/zhangvalue/article/details/87905372