【剑指offer】二叉搜索树的后续遍历序列

题目描述

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

解题思路

  1. 递归大法好
  2. 如果start == end,则说明数组为空,返回true
  3. 如果start > end,则说明递归到过程中对空数组进行了判断,直接返回true;
  4. 找到数组的从start到end中,第一个大于sequence[end-1]的元素的index,如果是二叉搜索树的话,则sequence[index]到sequence[end-1-1]的元素都应该小于sequence[end-1],sequence[start]到sequence[index-1]的元素都应该大于sequence[end-1],如果不满足这个条件,直接返回false,如果满足,则判断子数组是否是二叉搜索树。

代码

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence == null || sequence.length == 0) return false;
        return VerifySquenceOfBST(sequence, 0, sequence.length);
    }
    private boolean VerifySquenceOfBST(int [] sequence, int start, int end) {
        if(start >= end) return true;
        int index = findIndex(start, end, sequence);
        boolean flag = true;
        if(index < end - 1){
            for(int i = index; i < end - 1; i++){
                flag = flag && (sequence[i] > sequence[end - 1]);
            }
        }
        if(index > start){
            for(int i = start; i < index; i++){
                flag = flag && (sequence[i] < sequence[end - 1]);
            }
        }
        if(flag) return VerifySquenceOfBST(sequence, index, end-1) && VerifySquenceOfBST(sequence, start, index-1);
        return false;
    }
    private int findIndex(int start, int end, int[] sequence){
        for(int i = start; i < end; i++){
            if(sequence[i] > sequence[end-1]) return i;
        }
        return end - 1;
    }
}
发布了77 篇原创文章 · 获赞 1 · 访问量 5400

猜你喜欢

转载自blog.csdn.net/u010659877/article/details/103937787
今日推荐