九度 题目1367:二叉搜索树的后序遍历序列

题目链接:1367

题目描述:

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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
解:左子树小于根,右子树大于根,遍历顺序:左-右-根。

代码:

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
typedef long long ll;
struct Node  //结点结构
{
    ll val;
    Node *left;
    Node *right;
};
bool Is_BST(ll *val,int beg,int en)
{
    if(beg>en) return true;
    int i,j;
    ll temp=val[en];
    for(i=0;i<en;i++)
    {
        if(val[i]>temp)
        {
           break;
        }
    }
    for(j=i+1;j<en;j++)
    {
        if(val[j]<=temp)
            return false;
    }
    bool left=true;
    if(i>0)
        left=Is_BST(val,beg,i-1);
    bool right=true;
    if(i<en-1)
        right=Is_BST(val,i+1,en-1);
    return left&&right;
}

int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        ll *val=new ll[n+1];
        for(int i=0;i<n;i++)
            scanf("%lld",&val[i]);
        if(Is_BST(val,0,n-1))
            printf("Yes
");
        else
            printf("No
");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/Tobyuyu/p/4965275.html