• pta l2-4(这是二叉搜索树吗?)


    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192

    题意:给定n以及n个整数,问该序列是否为二叉搜索树的前序遍历或者二叉搜索树镜像的前序遍历,若是,则输出YES,并输出其后序遍历,否则输出NO。

    思路:先判断是否为二叉搜索树的前序遍历,令is=false,通过递归和二叉搜索树的性质计算其后序遍历序列,若序列长度等于n,即成立,否则令is=true,再次计算其后序遍历序列,若序列长度为n即成立,否则输出“NO”。

    AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 int n;
     5 vector<int> pre,post;
     6 bool is;
     7 
     8 void getpost(int l,int r){
     9     int i=l+1,j=r;
    10     if(l>r) return;
    11     if(!is){
    12         while(i<=r&&pre[i]<pre[l]) ++i;
    13         while(j>l&&pre[j]>=pre[l]) --j;
    14     }
    15     else{
    16         while(i<=r&&pre[i]>=pre[l]) ++i;
    17         while(j>l&&pre[j]<pre[l]) --j;
    18     }
    19     if(i-j!=1) return;
    20     getpost(l+1,j);
    21     getpost(i,r);
    22     post.push_back(pre[l]);
    23 }
    24 
    25 int main(){
    26     scanf("%d",&n);
    27     pre.resize(n);
    28     for(int i=0;i<n;++i)
    29         scanf("%d",&pre[i]);
    30     getpost(0,n-1);
    31     if(post.size()!=n){
    32         is=true;
    33         post.clear();
    34         getpost(0,n-1);
    35     }
    36     if(post.size()==n){
    37         printf("YES
    %d",post[0]);
    38         for(int i=1;i<n;++i)
    39             printf(" %d",post[i]);
    40         printf("
    ");
    41     }
    42     else
    43         printf("NO
    ");
    44     return 0;
    45 }
  • 相关阅读:
    Nginx 知识
    web页面乱码之字符集
    P2633 Count on a tree 树上主席树
    HDU 1542 线段树扫描线
    P4513 小白逛公园 线段树
    牛客4 C sequence
    P4126 [AHOI2009]最小割 网络流
    P3980 [NOI2008]志愿者招募 网络流
    P3313 [SDOI2014]旅行 动态开点线段树 树链剖分
    Planting Trees 单调队列
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/10541785.html
Copyright © 2020-2023  润新知