zoukankan      html  css  js  c++  java
  • pat 1043

    题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1043

    思想:给一个先序遍历, 对于二叉搜索树来说,中序遍历已知,题目中说的mirror 其实就是按照左大右小的顺序,所以对于题目给定的先序遍历, 先判断前2项,若第一项小于第二项,那可能是二叉搜索树(也可能是NO),这时候中序就升序排列,第一项大于等于第二项,可能是mirror,中序就降序排列。然后控制好下标,递归地后序遍历即可(中间判断这个序列是不是NO)。

     1 #include<iostream>
     2 #include<vector>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 vector<int> preorder;
     7 vector<int> inorder;
     8 vector<int> postorder;
     9 
    10 void nm_postorder(int pi, int pj, int ii, int ij)
    11 {
    12     if(pi > pj || ii > ij)
    13         return;
    14     int pos;
    15     for(int i = ii; i <= ij; ++i)
    16         if(inorder[i] == preorder[pi]){
    17             pos = i; break;
    18         }
    19     for(int i=1; i<=pos-ii; ++i)
    20         if(preorder[pi+i] >= preorder[pi]){
    21             return;
    22         }
    23     for(int i=pi+pos-ii+1; i<= pj; ++i)
    24         if(preorder[i] < preorder[pi]){
    25             return;
    26         }
    27     nm_postorder(pi+1, pi+pos-ii, ii, pos-1);
    28     nm_postorder(pi+pos-ii+1, pj, pos+1, ij);
    29     postorder.push_back(preorder[pi]);
    30 }
    31 
    32 void m_postorder(int pi, int pj, int ii, int ij)
    33 {
    34     if(pi > pj || ii > ij)
    35         return;
    36     int pos;
    37     for(int i = ij; i >= ii; --i)
    38         if(inorder[i] == preorder[pi]){
    39             pos = i; break;
    40         }
    41     for(int i=1; i<=pos-ii; ++i)
    42         if(preorder[pi+i] < preorder[pi]){
    43             return;
    44         }
    45     for(int i=pi+pos-ii+1; i<= pj; ++i)
    46         if(preorder[i] >= preorder[pi]){
    47             return;
    48         }
    49     m_postorder(pi+1, pi+pos-ii, ii, pos-1);
    50     m_postorder(pi+pos-ii+1, pj, pos+1, ij);
    51     postorder.push_back(preorder[pi]);
    52 }
    53 
    54 bool comp(int n1, int n2){
    55     if(n1 > n2)
    56         return true;
    57     else
    58         return false;
    59 }
    60 
    61 int main()
    62 {
    63     int N; cin>>N;
    64     preorder.resize(N);
    65     inorder.resize(N);
    66     for(int i=0; i != N; ++i){    
    67         cin>>preorder[i];
    68         inorder[i] = preorder[i];
    69     }
    70     if(preorder.size() == 1){
    71         cout<<"YES"<<endl<<preorder[0]<<endl;
    72         return 0;
    73     }
    74     else if(preorder[0] > preorder[1]){
    75         sort(inorder.begin(), inorder.end());
    76         nm_postorder(0, N-1, 0,N-1);
    77     }
    78     else{
    79         sort(inorder.begin(), inorder.end(), comp);
    80         m_postorder(0, N-1, 0, N-1);
    81     }
    82     if(postorder.size() != N)
    83         cout<<"NO"<<endl;
    84     else{
    85         cout<<"YES"<<endl;
    86         for(int i=0; i<N; ++i)
    87             if( i == N-1)
    88                 cout<<postorder[i]<<endl;
    89             else
    90                 cout<<postorder[i]<<" ";
    91     }
    92     return 0;
    93 }
  • 相关阅读:
    jenkins与gitlab集成,分支提交代码后自动构建任务(六)
    MySQL配置参数sync_binlog说明
    jenkins部署java项目(五)
    Mac OS X 中安装JDK 7
    centos 使用pip安装mysql-python
    CentOS6.4下安装TeamViewer8
    adb & adb shell 相关命令
    mac下限速
    mac 下 word 2011 使用笔记
    python twisted启动定时服务
  • 原文地址:https://www.cnblogs.com/bochen-sam/p/3402263.html
Copyright © 2011-2022 走看看