剑指offer——二叉搜索树的后序遍历序列

二叉搜索树的后序遍历序列

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

这里遇到的问题就是,传递的子数组怎么递归的传递下去,(Java基础不好,所以很多接口与方法都不熟悉)

看过答案之后,用的是Arrays的方法Arrays.copyOfRange(arrays, 1, 9);很神奇

还有就是左右两边子树判断的情况是不一样的,所以自己想的就很尴尬,不知道怎么处理

看了别人的答案之后,很神奇,先处理左边子树,在处理右边子树,然后再递归的进行左右子树内部的处理。

import java.util.Arrays;
public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length == 0) return false;
        int len = sequence.length;
        int root = sequence[len - 1];
        int i = 0;
        for(; i < len - 1; i++){
            if(root < sequence[i]) break;
        }
        int j = i;
        for(; j < len - 1; j++){
            if(root > sequence[j]) return false;
        }
        boolean leftIsBST = true;
        if(i > 0){
            leftIsBST = VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, i));
        }
        boolean rightIsBST = true;
        if(j < len - 1){
            rightIsBST = VerifySquenceOfBST(Arrays.copyOfRange(sequence, i, j));
        }
        return leftIsBST && rightIsBST;
    }
}

  

 

下面这一种方式不是很理解

看的别人的 i 定义为一个右边子树的开始结点,但是想不明白为什么要遍历一遍数组,来找出root>sequence[j]的个数来作为i

 

import java.util.Arrays;
public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length == 0) return false;
        int len = sequence.length;
        int root = sequence[len - 1];
        int i = 0;
        for(int j = 0; j < len - 1; j++){
            if(root > sequence[j]) i++;
        }
        if(i == 0){
            VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, len - 1));
        }else{
            for(int j = i; j < len - 1; j++){
                if(root > sequence[j]) return false;
            }
            VerifySquenceOfBST(Arrays.copyOfRange(sequence, 0, i));
            VerifySquenceOfBST(Arrays.copyOfRange(sequence, i, len - 1));
        }
        return true;
    }
}

  

 重新写了一个不传递数组,直接传子数组的位置大小的

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length == 0) return false;
        int len = sequence.length;
        return postTran(sequence, len - 1, 0, len - 2 );
    }
    
    public boolean postTran(int[] sequence, int len, int low, int high){
        if(len <= 0 || low >= high) return true;
        int index = low;
        while(index < len){
            if(sequence[index] > sequence[len]) break;
            index++;
        }
        int flag = index;
        while(index < len){
            if(sequence[index] < sequence[len]) return false;
            index++;
        }
        return postTran(sequence, flag - 1, low, flag - 2) 
            && postTran(sequence, high-1, flag, high-2);
    }
}

  

posted @ 2018-03-15 10:56  SkyeAngel  阅读(162)  评论(0编辑  收藏  举报