《剑指offer》Java实现

《剑指offer》Java实现--二叉搜索树的后续遍历序列

2018-10-12  本文已影响27人  南湖Giser

题目描述

    输入一个整数数组,判断该数组是不是二叉搜索树的后续遍历结果,假设输入数组的元素互不相等。

解题思路

    如下图的后续遍历序列为squence{5,7,6,9,11,10,8},对于序列数组squence,最后一个元素8即为树的根节点,我们以根节点为标准,从左往右搜索序列,左子树中的节点均小于根节点得到左子树序列{5,7,6},右子树中的节点均大于根节点得到右子树序列{9,11,10},左右子树以此递归搜索判断。


二叉搜索树

Java代码实现

/**
 * 给定一个数组形式的数列判断是否二叉搜索树的后续遍历,递归解法
 * @author Administrator
 * @version 2018/10/12
 */
public class Exe34_VerifySquenceOfBST {

    public static void main(String[] args) {
        
        int[] squence={5,7,6,9,11,10,8};
        System.out.println(verifySequenceOfBST(squence, 0, squence.length-1));

    }
    
    public static boolean verifySequenceOfBST(int[] squence,int startIndex,int endIndex) {
        
        if(squence==null||startIndex<0||startIndex>squence.length-1
            ||endIndex<startIndex||endIndex>squence.length-1) return false;
        else {
            //首先根据根节点(序列最后一个)将序列分成左右子树序列并判断合法性
            int root=squence[endIndex];
            int i=startIndex;
            for(;i<endIndex;i++){
                if(squence[i]>root)
                    break;
            }
            int j=i;
            for(;j<endIndex;j++){
                if(squence[j]<root)
                    return false;
            }
            
            //递归判断子序列的合法性
            boolean isLeftLeagel=true;
            if(startIndex<i-1){//注意这里条件判断,如果子序列长度为0,那么它也是合法的
                isLeftLeagel=verifySequenceOfBST(squence, startIndex, i-1);
            }
            boolean isRightLeagel=true;
            if(i<endIndex-1){//注意这里条件判断,如果子序列长度为0,那么它也是合法的
                isRightLeagel=verifySequenceOfBST(squence, i, endIndex-1);
            }
            
            return isLeftLeagel&&isRightLeagel;
        }
    
    }

}
上一篇下一篇

猜你喜欢

热点阅读