剑指offer面试题33:二叉搜索树的后序遍历序列(Java 实现)

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

思路:

已知条件:后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。

  1. 确定root;
  2. 遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树;
  3. 遍历右子树,若发现有小于root的值,则直接返回false;
  4. 分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)。

测试用例:

功能测试:

  1. 完全二叉树;所有节点只有左子树的二叉树;所有节点只有右子树的二叉树。
  2. 特殊测试:输入的根节点为空;二叉树只有一个节点。
public class test_thirty_three {
    public boolean VerifySquenceOfBST(int[] sequence){
        if (sequence == null || sequence.length<=0)return false;

        return isSquenceOfBST(sequence, 0, sequence.length-1);
    }

    private boolean isSquenceOfBST(int[] sequence, int left, int right) {
        //递归结束的条件
        if (left >= right)
            return true;

        //确定根节点的值
        int root = sequence[right];

        //在二叉搜索树中左子树节点的值小于根节点,i为右子树的第一个节点
        int i = left;
        for (; i<right-1; i++){
            if (sequence[i]>root)
                break;               //这里返回的是i的值
        }

        //在二叉搜索树中右子树节点的值大于根节点,如果不是,返回false
        for (int j = i; j<right-1; j++){
            if (sequence[j]<root)
                return false;
        }

        //分治算法把二叉树分为左子树和右子树两部分,分别判断
        //判断左子树是不是二分搜索树
        boolean isSquenceOfBST_left = true;
            isSquenceOfBST_left = isSquenceOfBST(sequence, left, i-1);

        //判断右子树是不是二分搜索树
        boolean isSequenceOfBST_right = true;
            isSequenceOfBST_right = isSquenceOfBST(sequence, i, right-1);

        return (isSquenceOfBST_left && isSequenceOfBST_right);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41163113/article/details/86560092