热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

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

  例如在下面的一颗二叉搜索树中,输入数组{5,7,6,9,11,10,8},则返回true,因为这个整数序列是下图二叉搜索树的后序遍历结果。如果输入的数组是{7,4,6,5},由于没有哪棵二叉搜索树的后序遍历的结果是这个序列,因此返回false。

二、解题思路

2.1 核心步骤

  在后序遍历得到的序列中,最后一个数字是树的根结点的值。数组中前面的数字可以分为两部分:第一部分是左子树结点的值,它们都比根结点的值小;第二部分是右子树结点的值,它们都比根结点的值大

  因此,我们可以总结出算法步骤:

  Step1.通过取出序列最后一个元素得到二叉搜索树的根节点;

  Step2.在二叉搜索树中左子树的结点小于根结点,因此可以遍历一次得到左子树;

  Step3.在二叉搜索树中右子树的结点大于根结点,因此可以继续遍历后序元素得到右子树;

  Step4.重复以上步骤递归判断左右子树是不是二叉搜索树,如果都是,则返回true,如果不是,则返回false;

2.2 代码实现

    public static bool VerifySquenceOfBST(int[] sequence, int length)
{
if (sequence == null || length <= 0)
{
return false;
}

int root = sequence[length - 1];

int i = 0;
// 在二叉搜索树中左子树的结点小于根结点
for (; i 1; i++)
{
if (sequence[i] > root)
{
break;
}
}
// 在二叉搜索树中右子树的结点大于根结点
int j = i;
for (; j 1; j++)
{
if (sequence[j] < root)
{
// 如果找到小于根节点直接返回false
return false;
}
}
// 判断左子树是不是二叉搜索树
bool leftIsBST = true;
if (i > 0)
{
leftIsBST
= VerifySquenceOfBST(sequence, i);
}
// 判断右子树是不是二叉搜索树
bool rightIsBST = true;
if (j 1)
{
// C#中无法直接操作指针,在C/C++可以直接传递sequence+i
int[] newSequence = sequence.Skip(i).ToArray();
rightIsBST
= VerifySquenceOfBST(newSequence, length - i - 1);
}

return leftIsBST && rightIsBST;
}
三、单元测试

3.1 测试用例

    //            10
// / \
// 6 14
// /\ /\
// 4 8 12 16
[TestMethod]
public void SequenceTest1()
{
int[] data = { 4, 8, 6, 12, 16, 14, 10 };
bool result = SequenceHelper.VerifySquenceOfBST(data, data.Length);
Assert.AreEqual(result,
true);
}

// 5
// / \
// 4 7
// /
// 6
[TestMethod]
public void SequenceTest2()
{
int[] data = { 4, 6, 7, 5 };
bool result = SequenceHelper.VerifySquenceOfBST(data, data.Length);
Assert.AreEqual(result,
true);
}

// 5
// /
// 4
// /
// 3
// /
// 2
// /
// 1
[TestMethod]
public void SequenceTest3()
{
int[] data = { 1, 2, 3, 4, 5 };
bool result = SequenceHelper.VerifySquenceOfBST(data, data.Length);
Assert.AreEqual(result,
true);
}

// 1
// \
// 2
// \
// 3
// \
// 4
// \
// 5
[TestMethod]
public void SequenceTest4()
{
int[] data = { 5, 4, 3, 2, 1 };
bool result = SequenceHelper.VerifySquenceOfBST(data, data.Length);
Assert.AreEqual(result,
true);
}

// 树中只有1个结点
[TestMethod]
public void SequenceTest5()
{
int[] data = { 5 };
bool result = SequenceHelper.VerifySquenceOfBST(data, data.Length);
Assert.AreEqual(result,
true);
}

// 错误序列
[TestMethod]
public void SequenceTest6()
{
int[] data = { 7, 4, 6, 5 };
bool result = SequenceHelper.VerifySquenceOfBST(data, data.Length);
Assert.AreEqual(result,
false);
}

// 错误序列
[TestMethod]
public void SequenceTest7()
{
int[] data = { 4, 6, 12, 8, 16, 14, 10 };
bool result = SequenceHelper.VerifySquenceOfBST(data, data.Length);
Assert.AreEqual(result,
false);
}

// 错误序列
[TestMethod]
public void SequenceTest8()
{
bool result = SequenceHelper.VerifySquenceOfBST(null, 0);
Assert.AreEqual(result,
false);
}

3.2 测试结果

 

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。


推荐阅读
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 尽管在WPF中工作了一段时间,但在菜单控件的样式设置上遇到了一些基础问题,特别是关于如何正确配置前景色和背景色。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 使用Matlab创建动态GIF动画
    动态GIF图可以有效增强数据表达的直观性和吸引力。本文将详细介绍如何利用Matlab软件生成动态GIF图,涵盖基本代码实现与高级应用技巧。 ... [详细]
  • 本文详细介绍了在Luat OS中如何实现C与Lua的混合编程,包括在C环境中运行Lua脚本、封装可被Lua调用的C语言库,以及C与Lua之间的数据交互方法。 ... [详细]
  • 本文深入探讨了动态赋值的概念及其在编程实践中的应用,特别是通过Java代码示例来展示如何利用循环结构动态地为数组分配值。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 贡献转移在计算每个元素的作用的时候,我们可以通过反向枚举作用效果,添加到作用元素的身上,这种方法叫做贡献转移。更正式的说, ... [详细]
  • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
  • 本文提供了一种有效的方法来解决当Android Studio因电脑意外重启而导致的所有import语句出现错误的问题。通过清除缓存和重建项目结构,可以快速恢复开发环境。 ... [详细]
  • 本文介绍了如何利用OpenCV库进行图像的边缘检测,并通过Canny算法提取图像中的边缘。随后,文章详细说明了如何识别图像中的特定形状(如矩形),并应用四点变换技术对目标区域进行透视校正。 ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 函子(Functor)是函数式编程中的一个重要概念,它不仅是一个特殊的容器,还提供了一种优雅的方式来处理值和函数。本文将详细介绍函子的基本概念及其在函数式编程中的应用,包括如何通过函子控制副作用、处理异常以及进行异步操作。 ... [详细]
  • 本文将探讨一个经典算法问题——最大连续子数组和。我们将从问题定义出发,逐步深入理解其背后的逻辑,并通过实例分析加深理解。 ... [详细]
  • 本文介绍了多维缩放(MDS)技术,这是一种将高维数据映射到低维空间的方法,通过保持原始数据间的关系,以便于可视化和分析。文章详细描述了MDS的原理和实现过程,并提供了Python代码示例。 ... [详细]
author-avatar
宠医_臻爱一生_156
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有