【剑指Offer面试题】 九度OJ1367:二叉搜寻树的后序遍历序列
【剑指Offer面试题】 九度OJ1367:二叉搜索树的后序遍历序列
题目链接地址:
http://ac.jobdu.com/problem.php?pid=1367
题目1367:二叉搜索树的后序遍历序列
时间限制:1 秒内存限制:32 兆特殊判题:否提交:1616解决:796
题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
输入:
每个测试案例包括2行:
第一行为1个整数n(1<=n<=10000),表示数组的长度。
第二行包含n个整数,表示这个数组,数组中的数的范围是[0,100000000]。
输出:
对应每个测试案例,如果输入数组是某二叉搜索树的后序遍历的结果输出Yes,否则输出No。
样例输入:
7
5 7 6 9 11 10 8
4
7 4 6 5
样例输出:
Yes
No
思路分析:
抓住题目的特点:
二叉搜索树:二叉搜索树的左子树中的所有元素均小于根结点的值,右子树中的所有元素均大于根结点的值.
后序遍历:最后一个元素对应根节点.
所以在数组中 小于根节点 大于根节点 根节点。
这样可以递归往下检查所有子树,全部符合的话,说明能够造出一个二叉搜索树。
时间复杂度O(nlogn)
空间复杂度O(1)
代码:
/*********************************
【剑指Offer面试题】 九度OJ1367:二叉搜索树的后序遍历序列
Author:牧之丶 Date:2015年
Email:bzhou84@163.com
**********************************/
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <math.h>
#include <stack>
#include <vector>
#include<queue>
using namespace std;
bool VerifySequenceBST(int *sequence,int len)
{
if(sequence==NULL || len<1)
return false;
int root = sequence[len-1];
int i;
for(i=0;i<len-1;i++)
if(sequence[i]>root)
break;
int j = i;
for(;j<len-1;j++)
if(sequence[j]<root)
return false;
bool left = true;
if(i > 0)
left = VerifySequenceBST(sequence,i);
bool right = true;
if(i < len-1)
right = VerifySequenceBST(sequence+i,len-i-1);
return (left && right);
}
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
int *sequence = (int *)malloc(n*sizeof(int));
if(sequence == NULL)
exit(EXIT_FAILURE);
int i;
for(i=0;i<n;i++)
scanf("%d",sequence+i);
if(VerifySequenceBST(sequence,n))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
/**************************************************************
Problem: 1367
Language: C++
Result: Accepted
Time:10 ms
Memory:1020 kb
****************************************************************
版权声明:本文为博主原创文章,未经博主允许不得转载。