zoukankan      html  css  js  c++  java
  • Hdu

    先上题目

      

    The order of a Tree

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 830    Accepted Submission(s): 448


    Problem Description
    As we know,the shape of a binary search tree is greatly related to the order of keys we insert. To be precisely:
    1.  insert a key k to a empty tree, then the tree become a tree with
    only one node;
    2.  insert a key k to a nonempty tree, if k is less than the root ,insert
    it to the left sub-tree;else insert k to the right sub-tree.
    We call the order of keys we insert “the order of a tree”,your task is,given a oder of a tree, find the order of a tree with the least lexicographic order that generate the same tree.Two trees are the same if and only if they have the same shape.
     
    Input
    There are multiple test cases in an input file. The first line of each testcase is an integer n(n <= 100,000),represent the number of nodes.The second line has n intergers,k1 to kn,represent the order of a tree.To make if more simple, k1 to kn is a sequence of 1 to n.
     
    Output
    One line with n intergers, which are the order of a tree that generate the same tree with the least lexicographic.
     
    Sample Input
    4 1 3 4 2
     
    Sample Output
    1 3 2 4
     
     
     
      级别是水题,可是还是wa了一次,还是明知道会wa的还是交了上去,题目的意思就是给你一棵二叉排序树的输入顺序,求出这棵树的先序遍历。
      这一题用指针来做的话很简单,但是我一开始用数组,而且知道2^100000一定会爆,但是还是用了数组来做= =,好吧我手贱。然后改成指针来做以后就过了,用时125MS。随后经人提醒用静态链表做,于是花了大概10分钟写出来了一个静态链表版的(好像更简单了= =),交上去1y,用时95MS,看来静态链表是个好东西啊,而且听说java没有指针,只可以用静态链表= =。
     
    上代码
     
     
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h>
     4 #include <stack>
     5 #define MAX 100000+10
     6 using namespace std;
     7 
     8 int d[MAX],l[MAX],r[MAX];
     9 
    10 void insert(int e)
    11 {
    12     int i;
    13     if(d[0]==1) {d[d[0]++]=e;;return;}
    14     i=1;
    15     while(1)
    16     {
    17         if(d[i]>e)
    18         {
    19             if(l[i]==0) {d[d[0]]=e;l[i]=d[0]++;return;}
    20             else i=l[i];
    21         }
    22         else
    23         {
    24             if(r[i]==0) {d[d[0]]=e;r[i]=d[0]++;return;}
    25             else i=r[i];
    26         }
    27     }
    28 }
    29 
    30 void load()
    31 {
    32     int i,count;
    33     stack<int> s;
    34     if(d[0]==1) return ;
    35     i=1;
    36     s.push(i);
    37     count=0;
    38     while(!s.empty())
    39     {
    40         i=s.top();
    41         s.pop();
    42         if(count++) printf(" ");
    43         printf("%d",d[i]);
    44         if(r[i]) s.push(r[i]);
    45         if(l[i]) s.push(l[i]);
    46     }
    47 }
    48 
    49 int main()
    50 {
    51     int i,n,e;
    52     while(scanf("%d",&n)!=EOF)
    53     {
    54         memset(d,0,sizeof(d));
    55         memset(l,0,sizeof(l));
    56         memset(r,0,sizeof(r));
    57         d[0]=1;
    58         for(i=0;i<n;i++)
    59         {
    60             scanf("%d",&e);
    61             insert(e);
    62         }
    63         load();
    64         printf("
    ");
    65     }
    66     return 0;
    67 }
    静态链表版
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <stdlib.h>
     4 #include <stack>
     5 #define MAX 100000+10
     6 using namespace std;
     7 
     8 typedef struct node
     9 {
    10     int d;
    11     struct node* l,*r;
    12 }node;
    13 
    14 node *p;
    15 
    16 void insert(node *f)
    17 {
    18     node *root;
    19     root=p;
    20     if(p==NULL) p=f;
    21     else
    22     {
    23         while(1)
    24         {
    25             if(root->d > f->d)
    26             {if(root->l)root=root->l;else {root->l=f;return;}}
    27             else
    28             {if(root->r)root=root->r;else {root->r=f;return;}}
    29         }
    30     }
    31 }
    32 
    33 void load()
    34 {
    35     int count;
    36     node* f;
    37     stack<node*> s;
    38     f=p;
    39     count=0;
    40     s.push(f);
    41     while(!s.empty())
    42     {
    43         f=s.top();
    44         if(count++) printf(" ");
    45         printf("%d",f->d);
    46         s.pop();
    47         if(f->r) s.push(f->r);
    48         if(f->l) s.push(f->l);
    49         free(f);
    50     }
    51 }
    52 
    53 int main()
    54 {
    55     int i,n,e,count;
    56     while(scanf("%d",&n)!=EOF)
    57     {
    58         node* f;
    59         p=NULL;
    60         for(i=0;i<n;i++)
    61         {
    62             scanf("%d",&e);
    63             f=(node*)malloc(sizeof(node));
    64             f->d=e;
    65             f->l=f->r=NULL;
    66             insert(f);
    67         }
    68         count=0;
    69         load();
    70         printf("
    ");
    71     }
    72     return 0;
    73 }
    指针版
  • 相关阅读:
    进程对象的属性或方法详解
    进程理论以及开启子进程的两种方式
    计算机发展史(多道技术)
    基于socketserver实现的并发(tcp和udp)
    基于udp协议的套接字及udp协议粘包问题
    模拟ssh的远程网络传输
    周考题目及答案
    c/s架构搭建
    网络编程基础
    10.16模拟赛(湖南集训)
  • 原文地址:https://www.cnblogs.com/sineatos/p/3189684.html
Copyright © 2011-2022 走看看