C#刷剑指Offer | 二叉搜索树的后序遍历序列
【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 | 二叉搜索树的后序遍历序列相关推荐
- [剑指offer] 二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列 P157 题目:输入一个数组,判断这个数组是不是一个二叉搜索树的后序遍历的结果. solution:我们知道后序遍历序列的最后一个item是根节点,如果确实是二叉搜索树的后序 ...
- 剑指offer——二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 这里遇到的问题就是,传递的子数组怎 ...
- [剑指offer]二叉搜索树的后序遍历数列
[剑指offer]二叉搜索树的后序遍历数列 剑指offer-二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 fals ...
- 剑指offer 二叉搜索树的后序遍历
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列
剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...
- 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列
[LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...
- 剑指offer——面试题24:二叉搜索树的后序遍历序列
剑指offer--面试题24:二叉搜索树的后序遍历序列 Solution1: 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二 ...
- 剑指offer之二叉搜索树的后序遍历序列
剑指offer之二叉搜索树的后序遍历序列 欢迎关注作者博客 简书传送门 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个 ...
- 剑指 Offer 33. 二叉搜索树的后序遍历序列
剑指 Offer 33. 二叉搜索树的后序遍历序列 原始题目链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian- ...
最新文章
- Exchange 2010迁移Exchange 2013(一)共存部署
- C++11(及现代C++风格)和快速迭代式开发
- php网站需要装zend吗,php-zend网站也需要别名
- CodeForces - 375D Tree and Queries 树启 + 思维
- (专题二)01 矩阵的处理-特殊矩阵
- pandas 日期比较大小_pandas处理日期时间,按照时间筛选
- SpringSecurity的认识和整合流程
- ZOJ3826 Hierarchical Notation(14牡丹江 H) 树套树
- python继承方式是基于原型吗_[译] 为什么原型继承很重要
- java对象描述开车_java面向对象
- HDU 1312 Red and Black(最简单也是最经典的搜索)
- 如何安装PANABIT?
- matlab 反复激活无效——许可证到期
- 哈夫曼编码与哈夫曼树
- android 问题-----Please execute 'adb uninstall com.newland.securityclient' in a shell.
- 面向对象:寻寻觅觅,诚邀你一起来解开这道迷题
- 获取网页视频,日常下载工具推荐——XDM
- 先电动,后智能,比亚迪为何能引领自动驾驶商业化?
- fork()创建子进程步骤、函数用法及常见考点(内附fork()过程图)
- 什么是CSM(Certified Scrum Master) 敏捷教练认证?
热门文章
- 联想(Lenovo)小新310经典版进bios方法
- iOS duplicate symbol for architecture arm64 解决办法
- Android Button监听的方式
- BZOJ 2588: Spoj 10628. Count on a tree 树上跑主席树
- andriod之应用内置浏览器 webview
- Office SharePoint Server 2007
- 收银员英文缩写_如何在没有收银员的苹果商店购买东西
- 【本人秃顶程序员】技巧分享丨spring的RestTemplate的妙用,你知道吗?
- 高清、免版权美图资源大全
- CC框架实践(1):实现登录成功再进入目标界面功能