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

测试用例:
1)功能测试(输入的后序遍历的序列对应一棵二叉树,包括完全二叉树,所有结点都没有左/右子树的二叉树、只有一个结点的二叉树;输入的后续遍历的序列没有对应一棵二叉树);
2)特殊输入测试(指向后序遍历序列的指针为null指针)。
 
代码实现:
package com.yyq;
import java.util.Arrays;
/**
* Created by Administrator on 2015/9/20.
*/
public class SequenceOfBST {
public static boolean verifySquenceOfBST(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;
if (i > 0)
left = verifySquenceOfBST(sequence,i);
//判断右子树是不是二叉搜索树
boolean right = true;
if (i < length-1) {
int[] temp = Arrays.copyOfRange(sequence, i, length-1);
right = verifySquenceOfBST(temp, length-i-1);
}
return (left && right);
}
// ====================测试代码====================
public static void Test(String testName, int sequence[], int length, boolean expected)
{
if(testName != null)
System.out.println(testName+" begins: " );
if(verifySquenceOfBST(sequence, length) == expected)
System.out.println("passed.");
else
System.out.println("failed.");
}
// 10
// / \
// 6 14
// /\ /\
// 4 8 12 16
public static void Test1()
{
int data[] = {4, 8, 6, 12, 16, 14, 10};
Test("Test1", data, data.length, true);
}
// 5
// / \
// 4 7
// /
// 6
public static void Test2()
{
int data[] = {4, 6, 7, 5};
Test("Test2", data, data.length, true);
}
// 5
// /
// 4
// /
// 3
// /
// 2
// /
//
public static void Test3()
{
int data[] = {1, 2, 3, 4, 5};
Test("Test3", data, data.length, true);
}
// 1
// \
// 2
// \
// 3
// \
// 4
// \
//
public static void Test4()
{
int data[] = {5, 4, 3, 2, 1};
Test("Test4", data, data.length, true);
}
// 树中只有1个结点
public static void Test5()
{
int data[] = {5};
Test("Test5", data, data.length, true);
}
public static void Test6()
{
int data[] = {7, 4, 6, 5};
Test("Test6", data, data.length, false);
}
public static void Test7()
{
int data[] = {4, 6, 12, 8, 16, 14, 10};
Test("Test7", data, data.length, false);
}
public static void Test8()
{
Test("Test8", null, 0, false);
}
public static void main(String[] args)
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
Test8();
}
}
 
结果输出:
Test1 begins: 
passed.
Test2 begins: 
passed.
Test3 begins: 
passed.
Test4 begins: 
passed.
Test5 begins: 
passed.
Test6 begins: 
passed.
Test7 begins: 
passed.
Test8 begins: 
passed.

P140、面试题24:二叉搜索树的后序遍历序列的更多相关文章

  1. 剑指Offer:面试题24——二叉搜索树的后序遍历序列(java实现)

    问题描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 思路: 1.首先后序遍历的结果是[(左子 ...

  2. 《剑指offer》面试题24 二叉搜索树的后序遍历序列 Java版

    (判断一个元素均不相同的序列是否为一个BST的LRD) 书中方法:首先对于二叉搜索树,左子树中的所有元素小于根节点小于右子树中的所有元素,然后后序遍历序列最后一个元素是根节点,这是我们已知的条件.这道 ...

  3. 《剑指offer》面试题33. 二叉搜索树的后序遍历序列

    问题描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同.   参考以下这颗二叉搜索树: 5 / \ ...

  4. 剑指 Offer 33. 二叉搜索树的后序遍历序列 + 根据二叉树的后序遍历序列判断对应的二叉树是否存在

    剑指 Offer 33. 二叉搜索树的后序遍历序列 Offer_33 题目详情 题解分析 本题需要注意的是,这是基于一颗二叉排序树的题目,根据排序二叉树的定义,中序遍历序列就是数据从小到大的排序序列. ...

  5. (剑指Offer)面试题24:二叉搜索树的后序遍历序列

    题目: 输入一个整数数组,判断该数组是不是某个二叉搜索树的后序遍历的结果,如果是则返回true,否则返回false. 假设输入的数组的任意两个数字都互不相同. 思路: 根据二叉搜索树的后序遍历特点,很 ...

  6. 剑指Offer面试题:22.二叉搜索树的后序遍历序列

    一.题目:二叉搜索树的后序遍历序列 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 例如在下面 ...

  7. 剑指offer-第四章解决面试题思路(判断一个数组是否为二叉搜索树的后序遍历序列)

    二叉搜索树:二叉搜索树根节点的左边都比根节点小,右边都比根节点大. 例题:输入一个数组,判断是否为二叉搜索树的后序遍历序列,如果是,返回true,如果不是,返回flase,假设没有重复的元素. 思路: ...

  8. 《剑指offer》第三十三题(二叉搜索树的后序遍历序列)

    // 面试题33:二叉搜索树的后序遍历序列 // 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果. // 如果是则返回true,否则返回false.假设输入的数组的任意两个数字都 ...

  9. 《剑指offer》二叉搜索树的后序遍历序列

    本题来自<剑指offer> 二叉搜索树的后序遍历序列 题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字 ...

  10. [PHP]算法- 判断是否为二叉搜索树的后序遍历序列的PHP实现

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

随机推荐

  1. 分享我写的IOCP:源码+思路

    首先说明,下面的代码仅是一个IOCP的demo,很多地方的设计非常差,当然也有一些设计还算可以:).此篇仅供对IOCP有些了解但又不深入的.需要一个稍微完整示例的.对网络编程感兴趣的同学参考.点击这里 ...

  2. 分享一个难得的YiBo微博客户端应用源码Android版

    今天给大家分享一款,YiBo微博客户端应用源码,这是一款专为Android用户打造的聚合型微博客户端,完美支持新浪微博.腾讯微博.搜狐微博.网易微博和饭否五个微博平台,界面清爽,使用简单轻巧,支持多账 ...

  3. KnockoutJS(2)-监控属性

    本节主要涉及到3个内容: 1. 监控属性 Observables (这个用的比较多,但是其本身使用比较简单,唯一需要注意就是,它监控的对象是一个方法,所以取值和设置值的时候容易混淆) 2. 计算属性  ...

  4. 正则应用—queryURLParameter()

    在项目中,我们做详情页的时候,需要获取到用户从哪里来点击进来,获取到用户的点击地址,根据不同的地址传进的参数向服务器获取不同的数据,然后加载不同的详情页面. 大部分企业都采用字符串截取的方式,quer ...

  5. tomcat使用memcached完成集群

    一.安装memcached 1.windows下安装memcached 需要到一个网站下载memcached的for win 32版本.在memcached的官方网站我是找不到的.我看了下,提供win ...

  6. MoneyUtil

    public class MoneyUtil {       private final static String[] CN_Digits = { "零", "壹&qu ...

  7. [Linux] Linux学习笔记(5)-文件与目录管理

    1.Linux目录结构为树状结构,最顶层的目录为跟目录"/",其它目录通过挂载可以将它添加到目录树中,通过解除挂载移除它们. 2.绝对路径与相对路径 绝对路径写法:由根目录&quo ...

  8. dapper extensions (predicates)

    https://github.com/tmsmith/Dapper-Extensions/wiki/Predicates The predicate system in Dapper Extensio ...

  9. Speech Patterns (string)

    People often have a preference among synonyms of the same word. For example, some may prefer "t ...

  10. closest()一个在评论里很有用的函数

    实例 本例演示如何通过 closest() 完成事件委托.当被最接近的列表元素或其子后代元素被点击时,会切换黄色背景: $( document ).bind("click", fu ...