【Offer】[33] 【二叉搜索树的后序遍历序列】

题目描述

  输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true, 否则返回false. 假设输入的数组的任意两个数字都互不相同。例如,输入数组{5,7,6,9,11,10,8},则返回true,因为这个整数序列是下图二叉搜索树的后序遍历结果。如果输入的数组是{7,4,6,5},则由于没有哪棵二叉搜索树的后序遍历结果是这个序列,因此返回false。
  
  

牛客网刷题地址

思路分析

  后序遍历序列中的最后一个数字为二叉树的根节点,这样二叉树就可以分为两部分,由于是二叉搜索树,左子树部分的值要小于根节点,右子树树部分的值要大于根节点。

测试用例

  1. 功能测试:输入的后序遍历序列对应一棵二叉树,包括完全二叉树、所有节点都没有左/右子树的二叉树、只有一个节点的二叉树;输入的后序遍历序列没有对应一棵二叉树。
  2. 特殊输入测试:指向后序遍历序列的指针为nullptr指针。

Java代码

public class Offer33 {
    public static void main(String[] args) {
        test1();
        test2();
        test3();
        
    }
    public static  boolean VerifySquenceOfBST(int [] sequence) {
        return Solution1(sequence);
    }
    private static boolean Solution1(int [] sequence) {
        if(sequence==null || sequence.length<=0) {
            return false;
        }
        return verifyCore(sequence, 0, sequence.length-1);
    }
    public static boolean verifyCore(int[] sequence,int start,int end) {
        if(start>=end) {
            return true;
        }
        int mid =start ;
        while(sequence[mid]<sequence[end]) {
            mid++;
        }
        for(int i=mid;i<end;i++) {
            if(sequence[i]<sequence[end]) {
                return false;
            }
        }
        return verifyCore(sequence, start, mid-1) && verifyCore(sequence, mid, end-1);
    } 

    private static void test1() {
        int[] sequence = {5,7,6,9,11,10,8};
        boolean verifySquenceOfBST = VerifySquenceOfBST(sequence);
        System.out.println(verifySquenceOfBST);
    }

    private static void test2() {

    }
    private static void test3() {

    }

}

代码链接

剑指Offer代码-Java

原文地址:https://www.cnblogs.com/haoworld/p/offer33-er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-li.html