zoukankan      html  css  js  c++  java
  • 剑指Offer:面试题24——二叉搜索树的后序遍历序列(java实现)

    问题描述:

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

    思路:

    1.首先后序遍历的结果是[(左子树的后序)(右子树的后序)根结点],那么我们首先找到了根结点的值,
    2.其次,我们知道二叉搜索树的性质是:任何结点的左子树的值小于根结点的值,小于右子树的值。
    3.因此,从后向前遍历,找到第一个小于root.val的,下标为index, 若index == n-1(n为数组的长度),则显然不满足,返回false, 否则我们可以将数组划分出来[(左子树的后序)(右子树的后序)根结点]。
    4.最后对左右子树递归的判断即可。(但是这里要注意左子树或右子树为空的情况)

    代码:

    public boolean VerifySquenceOfBST(int [] sequence) {
            if(sequence == null || sequence.length == 0){
                return false;
            }
    
    
            int n = sequence.length;
            if(n == 1 || n == 2){
                return true;
            }
    
    
            int index = -1;
            for(int i = n-2; i >= 0; i--){
                if(sequence[i] < sequence[n-1]){
                    index = i;
                    break;
                }
            }
    
            int[] left = new int[index+1];
            int[] right = new int[n-2-index];
    
            for(int i = 0; i <= index; i++){
                if(sequence[i] > sequence[n-1]){
                    return false;
                }
                left[i] = sequence[i];
            }
            for(int i = index+1; i< n-1; i++){
                right[i-index-1] = sequence[i];
            }
    
            if(index == n - 2 && left.length != 0){
                return VerifySquenceOfBST(left);
            }
    
            if(left.length == 0){
                return VerifySquenceOfBST(right);
            }
            if(right.length == 0){
                return VerifySquenceOfBST(left);
            }
    
    
            return VerifySquenceOfBST(left) && VerifySquenceOfBST(right);
    
    
        }
  • 相关阅读:
    10-2[RF] OOB validation
    5.css背景以及书写位置
    4.css基础
    3.表单form
    2.表格
    1.html基础
    正则表达式
    协程
    7.树与树算法
    6.排序与二分查找
  • 原文地址:https://www.cnblogs.com/wenbaoli/p/5655710.html
Copyright © 2011-2022 走看看