博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#刷剑指Offer | 二叉搜索树的后序遍历序列
阅读量:4033 次
发布时间:2019-05-24

本文共 3472 字,大约阅读时间需要 11 分钟。

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

设为星标,不再失联!

往期推文合集:

转载地址:http://bykdi.baihongyu.com/

你可能感兴趣的文章
Visual Studio 2010:C++0x新特性
查看>>
drwtsn32.exe和adplus.vbs进行dump文件抓取
查看>>
cppcheck c++静态代码检查
查看>>
在C++中使用Lua
查看>>
在Dll中调用自身的位图资源
查看>>
IP校验和详解
查看>>
C++中使用Mongo执行count和distinct运算
查看>>
一些socket的编程经验
查看>>
socket编程中select的使用
查看>>
C++获取文件大小常用技巧分享
查看>>
关于AIS编码解码的两个小问题
查看>>
GitHub 万星推荐:黑客成长技术清单
查看>>
可以在线C++编译的工具站点
查看>>
关于无人驾驶的过去、现在以及未来,看这篇文章就够了!
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
昨夜今晨最大八卦终于坐实——人类首次直接探测到了引力波
查看>>
如何优雅、机智地和新公司谈薪水?
查看>>
为什么读了很多书,却学不到什么东西?
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>