题目描述

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

题目解析

采用分治法的思想,找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。

  1. 后序遍历序列的最后一个元素为二叉树的根节点;
  2. 二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根结点。
算法步骤如下:
  1. 找到根结点;
  2. 遍历序列,找到第一个大于等于根结点的元素i,则i左侧为左子树、i右侧为右子树;
  3. 我们已经知道i左侧所有元素均小于根结点,那么再依次遍历右侧,看是否所有元素均大于根结点;若出现小于根结点的元素,则直接返回false;若右侧全都大于根结点,则:
  4. 分别递归判断左/右子序列是否为后序序列;

算法解答

public class Solution {
public boolean VerifySquenceOfBST(int[] sequence) {
if (sequence.length <= 0 || sequence == null) {
return false;
}
return VerifySequenceOfBST1(sequence, 0, sequence.length - 1);
} private boolean VerifySequenceOfBST1(int[] sequence, int start, int end) {
//若遍历完了还没报错就证明是该二叉搜索树的后序遍历,则返回false
if (start >= end) {
return true;
}
//根节点
int root = sequence[end];
//找到第一个大于根节点的位置,左边则为左子树,右边则为右子树
int i = start;
while (sequence[i] <=root && i<end) {
i++;
}
int j = i;
//查看右子树有没有小于根节点的数,有就直接返回错误
while (j < end) {
if (sequence[j] < root)
return false;
j++;
}
//若检验完右子树没有大于根节点的则下面用同样的方式递归左右子树
boolean left = VerifySequenceOfBST1(sequence, start, i-1);
boolean right = VerifySequenceOfBST1(sequence, i, end - 1);
return left && right;
}
}

最新文章

  1. [python]python try异常处理机制
  2. Java并发_volatile实现可见性但不保证原子性
  3. ST算法
  4. POJ 3678 Katu Puzzle(强连通 法)
  5. VTK初学一,b_PolyVertex_CellArray多个点的绘制
  6. 安装sqlserver2012时出现的丧心病狂的错误
  7. 【leetcode】Copy List with Random Pointer (hard)
  8. [Android] 如何查看apk需要支持的Android版本
  9. 计数排序算法——时间复杂度O(n+k)
  10. Android Bitmap和Canvas学习笔记 [转]
  11. MySQL入门笔记
  12. 微信小程序的一些限制
  13. c语言Winpcap编程构造并接收解析arp包
  14. CSS制作水平垂直居中对齐
  15. B计划
  16. win8安装sql2008及设置登陆名问题
  17. JavaScript常用代码书写规范
  18. Java__线程---基础知识全面实战---坦克大战系列为例
  19. 在执行hadoop fs命令时,出现WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable错误
  20. vue 配置了全局的http拦截器,单独某个组件不需要这个拦截器,如何设置

热门文章

  1. 容器技术之Docker私有镜像仓库docker-distribution
  2. Spring Cloud微服务(一):公共模块的搭建
  3. Centos7.x RPM安装ELK 7.5.0
  4. python数据类型转换&amp;&amp;格式化输出
  5. 数据源管理 | Kafka集群环境搭建,消息存储机制详解
  6. 组态与非组态结合的LT
  7. HashMap的方法及功能、StringBuffer的方法
  8. Dorado开发——树形下拉框
  9. Express4.x之中间件与路由详解及源码分析
  10. Java8新特性之函数式接口