【剑指Offer】二叉树——二叉查找树

package cn.dzp.flyroc.offer;

import java.util.Arrays;

public class VerifySquenceOfBSTDemo {

    /*题目描述:输入一个整数数组,判断该数组是否是某二叉搜索树的后序遍历的结果。
    若是是则输出YES,不然输出NO,假设输入的数组的任意两个数字都互不相同*/

    /*思路:在后序遍历的结果中,最后一个元素为根节点;
    从根节点开始扫描这个序列,比根节点小的,在左半部分;
    比根节点大的,在右半部分。根据这样的划分,把序列划分为左右两部分,
    咱们递归地确认序列的左、右两部分是否是都是二元查找树。*/


    /*实现步骤:
     * 1、判读数组是否为空,长度是否为0
     * 2、定义数组的长度,定义根节点的位置(数组中最后一个元素),定义一个标记
     * 3、判断左子树是否是小于根节点的值
     * 4、判断右子树是否是大于根节点的值
     * 5、递归遍历左右子树*/


    //代码实现

    public class TreeNode{       //定义TreeNode
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int val){

            this.val = val;
        }
    }


    public static boolean verifySquenceOfBST(int[] arr){

        //判断数组是否为空,长度是否为0
        if (arr == null || arr.length == 0){

            System.out.println("NO");
            return false;
        }

        int leng = arr.length;        //定义数组的长度
        int root = arr[leng - 1];       //定义根节点
        boolean flag = false;       //定义标记

        //判断左子树是否是小于根节点的值
        int i;
        for (i = 0; i < leng-1; i++){

            if (arr[i] < root){

                flag = true;

            }else {

                break;
            }
        }

        //判断右子树是否大于根节点
        for (int j = i; j < leng-1; j++){

            if (arr[j] > root){

                System.out.println("YES");
                flag = true;
                return flag;

            }else {

                flag = false;
                return flag;
            }
        }



        //递归遍历左右子树
        boolean left = true;
        if (i > 0){         //判断左子树是否成立

            left = verifySquenceOfBST(Arrays.copyOfRange(arr,0, i));
        }


        boolean right = true;
        if (i < leng-1){            //判断右子树是否成立

            right = verifySquenceOfBST(Arrays.copyOfRange(arr, i ,leng -1));
        }

        boolean result = left && right;
        return result;

    }

}
相关文章
相关标签/搜索