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; } }