【C/C++练习题】二叉搜索树的后序遍历序列

举报
王建峰 发表于 2021/11/19 00:58:38 2021/11/19
【摘要】 《剑指Offer》面试题33:二叉搜索树的后序遍历序列   1 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。   2 思路 二叉搜索树的所有左子树节点都小于等于根节点,所有右子树节点都大于等于根节...

《剑指Offer》面试题33:二叉搜索树的后序遍历序列

 


1 题目

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

 

2 思路

二叉搜索树的所有左子树节点都小于等于根节点,所有右子树节点都大于等于根节点。而后序遍历的优先遍历顺序是,左子节点->右子节点->根节点。

那么,将序列分成左子树节点、右子树节点、根节点三个部分,取序列中最后一个元素为当前二叉树的根节点,在判断左右区间中的节点是否满足搜索二叉树的定义,如果满足就对剩下的左右区间进行递归,否则返回false。当递归至树中只有一个节点的时候,返回true。

 

3 代码


  
  1. /*
  2. *********************************************************************************************************
  3. *
  4. * 模块名称 : 主程序
  5. * 文件名称 : demo.cpp
  6. * 版 本 : V1.0
  7. * 说 明 : 《剑指Offer》笔试题,确定二叉搜索树的后序遍历序列
  8. *
  9. * 修改记录 :
  10. * 版本号 日期 作者 说明
  11. * V1.0 2019-08-13 hinzer 正式发布
  12. *
  13. * 码云链接:
  14. *
  15. *********************************************************************************************************
  16. */
  17. #include "iostream"
  18. #include "cstdlib"
  19. using namespace std;
  20. typedef struct Node
  21. {
  22. int m_nValue;
  23. Node* m_pLeft;
  24. Node* m_pRight;
  25. }BinaryTreeNode;
  26. /******************************************************************************
  27. * 函数介绍:确定为二叉搜索树的后序遍历序列
  28. * 输入参数:array待判断的数组序列, length序列长度
  29. * 输出参数:无
  30. * 返回值:true 成功 , false 传入参数无效
  31. * 备注:无
  32. ******************************************************************************/
  33. bool Is_squence_of_BST(const int* array, int length)
  34. {
  35. //判断无效输入参数
  36. if (NULL == array || length <= 0)
  37. return false;
  38. //1.递归算法-回归条件
  39. if (length == 1)
  40. {
  41. return true;
  42. }
  43. //2.根据二叉搜索树的规则,判断左子树区间和右子树区间
  44. int i = 0; //
  45. while (!(array[i] <= array[length-1] && array[length-1] <= array[i+1]))
  46. {
  47. ++i;
  48. //防止数组越界
  49. if (i == length-1)
  50. return false;
  51. }
  52. //3.判断左子树节点 <= 根节点 <= 右子树节点
  53. int j = 0;
  54. for (j = 0;j <= i;++j)
  55. {//对左子树节点进行判断
  56. if (array[j] > array[length-1])
  57. return false;
  58. }
  59. for (j = i+1;j <= length-2;++j)
  60. {//对右子树节点进行判断
  61. if (array[j] < array[length-1])
  62. return false;
  63. }
  64. //4.递归算法-递推公式
  65. return (Is_squence_of_BST(&array[0], i+1) && Is_squence_of_BST(&array[i+1], length-i-2));
  66. }
  67. /******************************************************************************
  68. * 函数介绍:功能测试函数
  69. * 输入参数:无
  70. * 输出参数:无
  71. * 返回值:无
  72. * 备注:无
  73. ******************************************************************************/
  74. void test01()
  75. {
  76. int array1[] = {5, 7, 6, 9, 11, 10, 8};
  77. int array2[] = {7, 4, 6, 5};
  78. if (Is_squence_of_BST(array1, sizeof(array1)/sizeof(int)))
  79. {
  80. cout << "array1 is correct" << endl;
  81. }
  82. if (Is_squence_of_BST(array2, sizeof(array2)/sizeof(int)))
  83. {
  84. cout << "array2 is correct" << endl;
  85. }
  86. }
  87. int main(int argc, char const *argv[])
  88. {
  89. test01();
  90. return 0;
  91. }

 

4 运行

 

 

5 算法改进


  
  1. bool Is_squence_of_BST(const int* array, int length)
  2. {
  3. //判断无效输入参数
  4. if (NULL == array || length <= 0)
  5. return false;
  6. //1.递归算法-回归条件
  7. if (length == 1)
  8. {
  9. return true;
  10. }
  11. //2.根据二叉搜索树的规则,判断左子树区间和右子树区间
  12. int i = 0;
  13. for (i = 0;i < length-1;++i)
  14. {//搜索二叉树中,左子树节点小于根节点
  15. if (array[i] > array[length-1])
  16. break;
  17. }
  18. int j = 0;
  19. for (j = i;j < length-1;++j)
  20. {//搜索二叉树中,右节点的值大于根节点
  21. if (array[j] < array[length-1])
  22. return false;
  23. }
  24. //3.递归算法-递推公式
  25. return (Is_squence_of_BST(&array[0], i) && Is_squence_of_BST(&array[i], length-i-1));
  26. }

 

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/99469040

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。