【C#刷题】| 作者 / Edison Zhou

这是EdisonTalk的第289篇原创内容


我们来用之前学到的数据结构知识来刷《剑指Offer》的一些核心题目(精选了其中30+道题目),希望对你有帮助!本文题目为:二叉搜索树的后序遍历序列。

1题目介绍

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

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

2解题思路与实现

思路:

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

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

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

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

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

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

实现:

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

3单元测试

单元测试用例:

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

测试结果:

测试的结果情况如下图:

Ref参考资料

何海涛,《剑指Offer》

后台回复:剑指offer,即可获得pdf下载链接哟!

????扫码关注EdisonTalk

设为星标,不再失联!

往期推文合集:2020年上半年推文合集

C#刷剑指Offer | 二叉搜索树的后序遍历序列相关推荐

  1. [剑指offer] 二叉搜索树的后序遍历序列

    二叉搜索树的后序遍历序列 P157 题目:输入一个数组,判断这个数组是不是一个二叉搜索树的后序遍历的结果. solution:我们知道后序遍历序列的最后一个item是根节点,如果确实是二叉搜索树的后序 ...

  2. 剑指offer——二叉搜索树的后序遍历序列

    二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 这里遇到的问题就是,传递的子数组怎 ...

  3. [剑指offer]二叉搜索树的后序遍历数列

    [剑指offer]二叉搜索树的后序遍历数列 剑指offer-二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 fals ...

  4. 剑指offer 二叉搜索树的后序遍历

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  5. 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列

    剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...

  6. 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列

    [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...

  7. 剑指offer——面试题24:二叉搜索树的后序遍历序列

    剑指offer--面试题24:二叉搜索树的后序遍历序列 Solution1: 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二 ...

  8. 剑指offer之二叉搜索树的后序遍历序列

    剑指offer之二叉搜索树的后序遍历序列 欢迎关注作者博客 简书传送门 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个 ...

  9. 剑指 Offer 33. 二叉搜索树的后序遍历序列

    剑指 Offer 33. 二叉搜索树的后序遍历序列 原始题目链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian- ...

最新文章

  1. Exchange 2010迁移Exchange 2013(一)共存部署
  2. C++11(及现代C++风格)和快速迭代式开发
  3. php网站需要装zend吗,php-zend网站也需要别名
  4. CodeForces - 375D Tree and Queries 树启 + 思维
  5. (专题二)01 矩阵的处理-特殊矩阵
  6. pandas 日期比较大小_pandas处理日期时间,按照时间筛选
  7. SpringSecurity的认识和整合流程
  8. ZOJ3826 Hierarchical Notation(14牡丹江 H) 树套树
  9. python继承方式是基于原型吗_[译] 为什么原型继承很重要
  10. java对象描述开车_java面向对象
  11. HDU 1312 Red and Black(最简单也是最经典的搜索)
  12. 如何安装PANABIT?
  13. matlab 反复激活无效——许可证到期
  14. 哈夫曼编码与哈夫曼树
  15. android 问题-----Please execute 'adb uninstall com.newland.securityclient' in a shell.
  16. 面向对象:寻寻觅觅,诚邀你一起来解开这道迷题
  17. 获取网页视频,日常下载工具推荐——XDM
  18. 先电动,后智能,比亚迪为何能引领自动驾驶商业化?
  19. fork()创建子进程步骤、函数用法及常见考点(内附fork()过程图)
  20. 什么是CSM(Certified Scrum Master) 敏捷教练认证?

热门文章

  1. 联想(Lenovo)小新310经典版进bios方法
  2. iOS duplicate symbol for architecture arm64 解决办法
  3. Android Button监听的方式
  4. BZOJ 2588: Spoj 10628. Count on a tree 树上跑主席树
  5. andriod之应用内置浏览器 webview
  6. Office SharePoint Server 2007
  7. 收银员英文缩写_如何在没有收银员的苹果商店购买东西
  8. 【本人秃顶程序员】技巧分享丨spring的RestTemplate的妙用,你知道吗?
  9. 高清、免版权美图资源大全
  10. CC框架实践(1):实现登录成功再进入目标界面功能