转自:http://blog.csdn.net/tianshuai11/article/details/7068755

判断整数序列是不是二叉查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
           如果是返回true,否则返回false。

例如:输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历(左右根)结果:

8
       /     \
     6      10
    /  \     /    \
   5   7  9  11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。

分析:最后一个输出的节点为,根节点。因为7大于根节点,所以前三个节点应该为右子树。而4应该为5左子树所以此序列不是任何一个二叉查找树的后续遍历结果。

求解思路:采用分治思想。

先是整体:最后一个为根节点,然后从前向后遍历序列,直到大于根节点(此时将左子树过滤)

然后验证:过滤掉左子树,除去根节点后,剩余节点为右子树。只要右子树所有节点大于根则正确,否则不是后序遍历序列。

分治验证:对左、右子树,采用同样的方法验证。

源码:

[html] view plaincopy
  1. #include"stdio.h"
  2. /*后序遍历,最后输出的节点,一定是根节点
  3. 此题的解法,采用思想:分治
  4. */
  5. bool Test_Squence_BST(int squence[], int length)
  6. {
  7. if(squence == NULL || length <= 0)//如果输出序列为空,或者输出长度为0则返回false
  8. return false;
  9. int root = squence[length - 1];//
  10. int i = 0;
  11. for(; i < length - 1; ++ i)//将二叉查找树,左子树过滤掉
  12. {
  13. if(squence[i] > root)  //找到大于根的节点
  14. break;
  15. }
  16. int j = i;//采用j的原因是,让i记录左子树个数
  17. for(; j < length - 1; ++ j) //过滤掉左子树后,剩余的除了根节点外,理论上全为右子树
  18. {
  19. if(squence[j] < root)
  20. return false;//如果存在不正确的,这里就会返回false .不会继续递归调用子树
  21. }
  22. bool left = true;//验证左子树,是否也为后序遍历序列
  23. if(i > 0)
  24. left = Test_Squence_BST(squence, i);
  25. bool right = true;//验证右子树,是否也为后序遍历序列
  26. if(i < length - 1)
  27. right = Test_Squence_BST(squence + i, length - i - 1);
  28. return (left && right);
  29. }
  30. int main()
  31. {
  32. //int a[7]={5,7,6,9,11,10,8};
  33. int a[4]={7,4,6,5};
  34. if(Test_Squence_BST(a,4))
  35. printf("YES");
  36. else
  37. printf("NO");
  38. }

判断整数序列是不是二叉查找树的后序遍历结果相关推荐

  1. 判断给定序列是否为BST后序遍历序列

    输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.假设输入的数组的任意两个数字都互不相同. 目录 一.BST 1.1 定义 1.2 性质 二.思路 2.1 非递归版本 2.2 递归版本 ...

  2. 【从零单排之微软面试100题系列】09二叉查找树的后序遍历

    本题目选自July大神博客系列[微软面试100题]: july大神,该系列我主要用来记录我的学习笔记. 题目描述:输入1个整数数组,判断该数组是不是某二元查找树的后序遍历结果.数组保证任意两个数组均不 ...

  3. 二叉树:通过前序遍历与中序遍历序列输出二叉树的后序遍历序列

    题目描述: 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树: 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树: 后序遍历: ...

  4. 判断整数序列是否是二叉查找树的后序遍历

    这是一道面试题,解题的代码如下(我这里把有重复节点的序列排除了,这里的二叉树不允许有相同值得节点): bool JudgeListIsBSTreePostOrder(int* iArray, int ...

  5. 判断某数组是不是二叉树的后序遍历序列 python递归与非递归解法

    python 递归 class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif len(sequence) &l ...

  6. 判断某个数列是不是二元查找树的后序遍历。

    给定一个数组序列,判断这个数列是不是二叉查找树的后序遍历.后序遍历是先左节点,再右节点,最后根节点.二叉查找树定义为节点的左子树都小于该节点,该节点的右子树都大于该节点.如果是后序遍历,那么根是最后一 ...

  7. 二叉查找树的先序遍历,中序遍历,后序遍历

    1.有一个二叉查找树,存储者字符'A','B','C','D','E','F','G','H',下面哪个结果是后序树遍历结果 A.   ADBCEGFH B.   BCAGEHFD C.   BCAE ...

  8. C++实现已知二叉树前序遍历和中序遍历,求后序遍历

    C++实现已知二叉树前序遍历和中序遍历,求后序遍历 一.基本概念 1.先序遍历(NLR)可以确定二叉树的父子结点: 2.中序遍历(LNR)可以确定二叉树的左右子树: 3.后序遍历(LRN)可以确定二叉 ...

  9. 判断整数序列是不是二元查找树的后序遍历结果

    题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果. 如果是返回true,否则返回false. 例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果: 8 ...

最新文章

  1. 管理员技术(六): 硬盘分区及格式化、 新建一个逻辑卷、调整现有磁盘的分区、扩展逻辑卷的大小、添加一个swap分区...
  2. 第6章:可维护性软件构建方法 6.2可维护性设计模式
  3. IBM-JAVA面试题
  4. M2Eclipse:Maven Eclipse插件无法搜索远程库的解决方法
  5. CF623E Transforming Sequence(多项式/倍增fft/动态规划)
  6. python argparse nargs_Python | 使用argparse解析命令行参数
  7. python3+requests+unittest_python3+requests+unittest:接口自动化测试(一)
  8. linux下好用的超级终端,【整理】Windows下超级终端的最佳替代品,免费的串口终端工具Putty...
  9. Unity制作游戏自定义按键
  10. database is locked错误
  11. 为什么程序猿996会猝死,而企业家007却不会?
  12. 高效能人士的七个习惯 读书笔记
  13. mysql用户主机设置密码_MySQL用户账号管理(添加、删除、限制、设置密码、远程访问)...
  14. 基于Docker的交互式人脸识别应用
  15. Hive-cli(hive)与Beeline的区别
  16. 设置全局css/less/sass样式and优化与style-resources-loader的理解
  17. 虚拟机的三种网络模式
  18. 基于微信小程序的师生答疑交流平台APP
  19. JS中 ?? 与 || 的区别
  20. vue plupload 的使用

热门文章

  1. 化工热力学重修补考第三章重点内容
  2. 九十八、轻松搞定Python中的Markdown系列
  3. 用python模拟高斯分布
  4. ICLR 2022 | 从因果不变性视角探讨图神经网络的分布外泛化鲁棒性
  5. 【面试必备】通俗易懂的XGBoost、Transformer、BERT、水波网络原理解析
  6. CVPR 2019 | APDrawingGAN:人脸秒变艺术肖像画
  7. python读取word指定内容_python解析html提取数据,并生成word文档实例解析
  8. Spring管理Bean的生命周期
  9. Spring Security——认证失败时获取认证信息(用户名、密码、IP、SESSIONID)
  10. JAVA——基于HttpClient的获取帆软FineReport报表爬虫DEMO