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

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

8
       /  \
      6    10
    / \    / \
   5   7   9  11

因此返回true。

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

分析:这是一道trilogy的笔试题,主要考查对二元查找树的理解。

在后续遍历得到的序列中,最后一个元素为树的根结点。从头开始扫描这个序列,比根结点小的元素都应该位于序列的左半部分;从第一个大于跟结点开始到跟结点前面的一个元素为止,所有元素都应该大于跟结点,因为这部分元素对应的是树的右子树。根据这样的划分,把序列划分为左右两部分,我们递归地确认序列的左、右两部分是不是都是二元查找树。

参考代码:

using namespace std;///
// Verify whether a squence of integers are the post order traversal
// of a binary search tree (BST)
// Input: squence - the squence of integers
//        length  - the length of squence
// Return: return ture if the squence is traversal result of a BST,
//         otherwise, return false
///
bool verifySquenceOfBST(int squence[], int length)
{if(squence == NULL || length <= 0)return false;// root of a BST is at the end of post order traversal squenceint root = squence[length - 1];// the nodes in left sub-tree are less than the rootint i = 0;for(; i < length - 1; ++ i){if(squence[i] > root)break;}// the nodes in the right sub-tree are greater than the rootint j = i;for(; j < length - 1; ++ j){if(squence[j] < root)return false;}// verify whether the left sub-tree is a BSTbool left = true;if(i > 0)left = verifySquenceOfBST(squence, i);// verify whether the right sub-tree is a BSTbool right = true;if(i < length - 1)right = verifySquenceOfBST(squence + i, length - i - 1);return (left && right);
}

本文已经收录到《剑指Offer——名企面试官精讲典型编程题》一书中,有改动,书中的分析讲解更加详细。欢迎关注。这篇博客对应的英文版详见http://codercareer.blogspot.com/2011/09/no-06-post-order-traversal-sequences-of.html。欢迎感兴趣的朋友阅读并批评指正。

本题已被九度Online Judge系统收录,欢迎读者移步到http://ac.jobdu.com/hhtproblems.php在线测试自己的代码。

博主何海涛对本博客文章享有版权。网络转载请注明出处

http://zhedahht.blog.163.com/。整理出版物请和作者联系。

程序员面试题精选100题(06)-二元查找树的后序遍历结果[数据结构]相关推荐

  1. 程序员面试题精选100题(09)-链表中倒数第k个结点[数据结构]

    题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针.链表结点定义如下: struct ListNode {       int       m_nKey;      ...

  2. 程序员面试题精选100题(48)-二叉树两结点的最低共同父结点[数据结构]

    题目:二叉树的结点定义如下: struct TreeNode { int m_nvalue; TreeNode* m_pLeft; TreeNode* m_pRight; }; 输入二叉树中的两个结点 ...

  3. 程序员面试题精选100题(27)-二元树的深度[数据结构]

    题目:输入一棵二元树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 例如:输入二元树: 10                     ...

  4. 程序员面试题精选100题(05)-查找最小的k个元素[算法]

    题目:输入n个整数,输出其中最小的k个. 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的k个 ...

  5. 程序员面试题精选100题

    程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树   ...

  6. 程序员面试题精选100题:41-50解题报告

    程序员面试题精选100题(41)-把数组排成最小的数[算法]   题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个.例如输入数组{32,  321},则输出这两个能 ...

  7. [程序员面试题精选100题]13.第一个只出现一次的字符

    [题目] 在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b. [分析] [代码] /********************************* * 日期:2013- ...

  8. 程序员面试题精选100题(51)-顺时针打印矩阵

    // 程序员面试题精选100题(51)-顺时针打印矩阵.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostre ...

  9. 程序员面试题精选100题:求从1到n的正数中1出现的次数

    // 程序员面试题精选100题(25):求从1到n的正数中1出现的次数 // 如 f(253) = (2!=0) * 100 + 2 * f(99) + (5!=0) * 10 + 5 * f(9) ...

最新文章

  1. 【BZOJ】4873: [Shoi2017]寿司餐厅
  2. Linux 虚拟机 安装 vmware-tools
  3. Linux 命令出现号(大于号)如何退出
  4. flstudio插件找不到_【干货】音频插件完全指引手册
  5. 未指定的IO标准导致vivado生成bit文件报错
  6. win11如何退出磁贴桌面 Windows11退出磁贴桌面的设置方法
  7. 盘点各种程序员常用的框架,看看你是否落伍了?
  8. java前端向后端传送实体类数据
  9. texLive使用一条龙
  10. iOS面试--最新快手iOS面试题
  11. TCP/IP重传超时--RTO - SRTT (Smoothed Round Trip Time)
  12. Pandas学习——分组
  13. python 自动执行 apdl_【转载】利用VB生成APDL文件 和Python文件的方法
  14. kail之MSF渗透测试
  15. 用深度学习构造聊天机器人简介
  16. Python AutoCAD 注释
  17. 带有数字化伪装外观,全新ID.7轿车即将全球首发
  18. 强制内联和强制不内联
  19. 小程序和H5有什么区别?
  20. 1、pinpoint-简介

热门文章

  1. 解密谷歌机器学习工程最佳实践——机器学习43条军规 翻译 2017年09月19日 10:54:58 98310 本文是对Rules of Machine Learning: Best Practice
  2. SpringBoot - 优雅的实现【参数分组校验】高级进阶
  3. jvm性能调优 - 08什么情况下对象会被GC
  4. 实战SSM_O2O商铺_33【商品】商品编辑之Service层的实现
  5. Spring Cache抽象-使用Java类注解的方式整合EhCache
  6. Spring-AOP概述
  7. php 限制登陆设备,登陆界面限制到只允许一台机器在线-PHP教程,PHP应用
  8. java图形界面猜字游戏,java程序,猜字游戏,希望大神帮忙
  9. 创建一个类 new 与 不加new 有什么区别?
  10. python网络编程案例_Python 网络编程_python网络编程基础_python高级编程