判断一个序列是否为某二叉搜索树的后续遍历结果

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

分析:二叉搜索树的根节点的左子树值小于根节点,右子树值大于根节点。根节点位于序列的尾部。递归判断节点的左右子树是否为二叉搜索树的后续遍历。

代码如下:

package com.wyl.sequence;

import java.util.Arrays;

/**
 * 判断一个序列是否为某个二叉搜索树的后序遍历序列
 * 思想:序列的最后一个值是树根节点的值,先遍历左子树,其值比根节点小,右子树的值比根节点大
 * @author wyl
 *
 */
public class BinarySearchTree {
    /**
     * 判断序列是否为二叉搜索树的一个可能后续遍历
     * @param sequence 待判断序列
     * @param length 序列长度
     * @return 序列是否为可能的后序遍历序列
     */
    public boolean verifyBST(int[] sequence, int length){
        if(sequence == null || length <= 0){
            return false;
        }
        int root = sequence[length - 1]; //序列的最后一个值为根节点的值
        //二叉搜索树的左节点值小于根节点
        int i = 0 ;
        for(;i<length-1;i++){
            if(sequence[i] > root){
                break;
            }
        }
        //二叉搜索树的右节点值大于根节点
        int j = i ;
        for(;j<length-1;j++){
            if(sequence[j] < root){
                return false;
            }
        }
        
        //判断左子树是否为二叉搜索树的后续遍历
        boolean left = true; //左子树为1个节点
        if(i>0){
            left = verifyBST(sequence, i);
        }
        
        //判断左子树是否为二叉搜索树的后续遍历
        boolean right = true;//右子树为1个节点
        if(i<length-1){
            int [] newData; //用来保存右子树
            newData = Arrays.copyOfRange(sequence, i, length-1);
            right = verifyBST(newData, length-1-i);
        }
        if(left && right){
            return true;
        }
        return false;
    }
    
    public static void main(String[] args) {
        BinarySearchTree bst = new BinarySearchTree();
        int[] sequence = {5,7,6,9,12,11,8};
        boolean b = bst.verifyBST(sequence, sequence.length);
        System.out.println(b);
    }
}

 

posted @ 2017-07-25 10:16  Miss_wang  阅读(655)  评论(0编辑  收藏  举报