题目:

输入一个整数数组,判断该数组是不是某个二叉搜索树的后序遍历的结果,如果是则返回true,否则返回false。

假设输入的数组的任意两个数字都互不相同。

思路:

根据二叉搜索树的后序遍历特点,很容易可以判断该数组是否为后序遍历的结果。

在二叉搜索树的后序遍历序列中,最后一个数字是树的根节点的值,数组中前面的数字可以分为两部分,第一部分是左子树结点的值,他们都比根节点的值小;第二部分是右子树节点的值,他们都比根节点的值大。

因此,判断某数组是否为后序遍历的结果,可以先找到数组的最后一个数,即根节点的值,然后根据根节点的值找到第一部分(左子树,比根节点小),接着判断第二部分(右子树)的所有结点的值是否都比根节点的值大,如果不是,返回false。否则再判断第一部分和第二部分是否都为后序遍历结果(递归),如果是,则返回true。

类似题目:

将题目中的后序遍历改为先序遍历,思路一样。

代码:

#include <iostream>

using namespace std;

bool VerifySequenceOfBST(int sequence[],int length){
if(sequence==NULL || length<=0)
return false;
int root=sequence[length-1]; int leftIndex=0;
while(sequence[leftIndex]<root)
leftIndex++; int rightIndex=leftIndex;
while(rightIndex<length-1){
if(sequence[rightIndex]<root)
return false;
rightIndex++;
} bool left=true;
if(leftIndex>0)
left=VerifySequenceOfBST(sequence,leftIndex); bool right=true;
if(leftIndex<length-1)
right=VerifySequenceOfBST(sequence+leftIndex,length-leftIndex-1); return (left&&right);
} int main()
{
int A[]={5,7,6,9,10,8};
int B[]={7,4,6,5};
int lengthA=sizeof(A)/sizeof(A[0]);
int lengthB=sizeof(B)/sizeof(B[0]);
cout << VerifySequenceOfBST(A,lengthA) << endl;
cout << VerifySequenceOfBST(B,lengthB) << endl;
return 0;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/a861533d45854474ac791d90e447bafd?rp=1

AC代码:

class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int length=sequence.size();
if(length<=0) return false;
return VerifySquence(sequence,0,length-1);
} bool VerifySquence(vector<int> sequence,int begin,int end) {
if(begin>=end)
return true; int root=sequence[end];
int leftIndex=begin;
while(sequence[leftIndex]<root)
++leftIndex; int rightIndex=leftIndex;
while(rightIndex<end){
if(sequence[rightIndex]<root)
return false;
++rightIndex;
} return VerifySquence(sequence,begin,leftIndex-1)&&VerifySquence(sequence,leftIndex,end-1); }
};

(剑指Offer)面试题24:二叉搜索树的后序遍历序列的更多相关文章

  1. 剑指Offer:面试题24——二叉搜索树的后序遍历序列(java实现)

    问题描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 思路: 1.首先后序遍历的结果是[(左子 ...

  2. 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列

    剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...

  3. 剑指offer(23)二叉搜索树的后序遍历序列

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 题目分析 1.后续遍历我们可以知道,最右边的是根节 ...

  4. 【剑指Offer】23、二叉搜索树的后序遍历序列

      题目描述:   输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同.   解题思路:   对于后续遍历序列,序 ...

  5. 《剑指offer》面试题24 二叉搜索树的后序遍历序列 Java版

    (判断一个元素均不相同的序列是否为一个BST的LRD) 书中方法:首先对于二叉搜索树,左子树中的所有元素小于根节点小于右子树中的所有元素,然后后序遍历序列最后一个元素是根节点,这是我们已知的条件.这道 ...

  6. 《剑指offer》面试题33. 二叉搜索树的后序遍历序列

    问题描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同.   参考以下这颗二叉搜索树: 5 / \ ...

  7. 【Offer】[33] 【二叉搜索树的后序遍历序列】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回true, 否则返回false. 假设输入的数组的任意两个数字 ...

  8. 剑指 Offer 33. 二叉搜索树的后序遍历序列 + 根据二叉树的后序遍历序列判断对应的二叉树是否存在

    剑指 Offer 33. 二叉搜索树的后序遍历序列 Offer_33 题目详情 题解分析 本题需要注意的是,这是基于一颗二叉排序树的题目,根据排序二叉树的定义,中序遍历序列就是数据从小到大的排序序列. ...

  9. 剑指Offer面试题:22.二叉搜索树的后序遍历序列

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

随机推荐

  1. 中小型数据库 RMAN CATALOG 备份恢复方案(二)

    中小型数据库呈现的是数据库并发少,数据库容量小,版本功能受限以及N多单实例等特点.尽管如此,数据库的损失程度也会存在零丢失的情形.企业不愿意花太多的钱又要保证数据库的可靠稳定,可是苦煞了我这些搞DB的 ...

  2. 使用rsync+inotify+apache做分布式图片服务器的部署方法

    图片服务器一般是做成分布式的,但要使得所有的图片服务器的文件一致,可以由一个主服务器将文件推送到各个备份服务器上. rsync:文件差异检查及文件推送 inotify:事件触发,实时检测到添加.删除. ...

  3. Web开发基础

    一.后台 1.MyEclipse:Java Web的编辑器 2.Java Servlet:后台代码 3.Velocity:前后台接口 4.mySql:数据库 二.前台 1.js:前台代码 2.jQue ...

  4. java 调用 .net webservice

    1.首先下载Axis2工具包 2.解压之后用cmd命令进入bin目录WSDL2Java.bat -uri http://192.168.20.42:9999/LoginService.asmx?wsd ...

  5. 防范 DDoS 攻击的 15 个方法

    为了对抗 DDoS(分布式拒绝服务)攻击,你需要对攻击时发生了什么有一个清楚的理解. 简单来讲,DDoS 攻击可以通过利用服务器上的漏洞,或者消耗服务器上的资源(例如 内存.硬盘等等)来达到目的.DD ...

  6. 在刚接触TI-DM8127-ipnc框架时注意的问题

    1. 修改内存分配不成功? 解决方法: 修改内存分配后需要重新编译mcfw.它影响3个核. 如果修改了cmem需要修改boostara. 2. 命令make clean后在make相机跑不起来? 解决 ...

  7. 【leetcode】155 - Min Stack

    Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...

  8. 转-sketch技巧

    10个帮你UI设计提速的Sketch使用技巧 2015-4-11 09:59| 发布者: yuanxingbbs| 查看: 1129| 评论: 0   选择使用Sketch的理由很多,因为好奇跟风安装 ...

  9. 在C语言环境下使用google protobuf

    本文写给经常使用C编程且不喜欢C++而又要经常使用google protobuf的人.        经常写通讯程序的人对数据进行序列化或者反序列化时,可能经常使用google的protobuf(PB ...

  10. Archlinux 踩坑实录

    Archlinux 没声音 1. 排查驱动,声卡驱动没问题 2.排查alsa,alsa没问题(并确认声卡存在且取消静音) 3.抱着尝试的心态,安下VLC.然后提示找不到默认声卡设备(大概这个意思),通 ...