#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 100 #define MAX 0x06FFFFFF #define V vector<int> using namespace std; int used[LEN]; int cnt=0; typedef struct Node{ struct Node *l=NULL;struct Node *r=NULL; int d; Node(){} Node(int D){d=D;} Node(Node *obj){ if(obj){ d=obj->d; l=obj->l; r=obj->r; } } }Node; typedef struct inputInfo{ int index;string l;string r; }inputInfo; inputInfo infos[LEN]; Node * nodes[LEN]; Node * createNodes(int index); void inOrder(Node * node); Node * root; void invert(Node* node); void levelOrder(Node*node); string inStr=""; string levelStr=""; int main(){ // freopen("d:/input/A1102.txt","r",stdin); int n; scanf("%d",&n); int i; FF(i,n){ char ch1[LEN];char ch2[LEN]; I("%s%s",ch1,ch2); infos[i].index=i;infos[i].l=ch1;infos[i].r=ch2; } FF(i,n){ root=createNodes(i); if(cnt>=n) break; } invert(root); inOrder(root); levelOrder(root); puts(levelStr.substr(0,levelStr.size()-1).c_str()); puts(inStr.substr(0,inStr.size()-1).c_str()); return 0; } void levelOrder(Node*node){ queue<Node*> q; q.push(node); while(!q.empty()){ Node* t=q.front(); q.pop(); char buffer[LEN]; sprintf(buffer,"%d ",t->d); levelStr+=buffer; if(t->l) q.push(t->l); if(t->r) q.push(t->r); } } Node * createNodes(int index){ if(used[index]) return NULL; cnt++; used[index]=1; int d=infos[index].index; inputInfo f=infos[index]; Node *node =new Node(d); if(f.l!="-"){ int i=0; sscanf(f.l.c_str(),"%d",&i); if(used[i]){ node->l=nodes[i]; }else{ node->l=createNodes(i); } } if(f.r!="-"){ int i=0; sscanf(f.r.c_str(),"%d",&i); if(used[i]){ node->r=nodes[i]; }else{ node->r=createNodes(i); } } nodes[index]=node; return node; } void inOrder(Node * node){ if(node){ inOrder(node->l); char buffer[LEN]; sprintf(buffer,"%d ",node->d); inStr+=buffer; inOrder(node->r); } } void invert(Node* node){ if(!node) return; if(node->l) invert(node->l); if(node->r) invert(node->r); Node * t=NULL; if(node->l)t=new Node(node->l); node->l=NULL; if(node->r)node->l=new Node(node->r); node->r=t; }
超简单的一道题,居然写了一个小时,还写了一百多行……明天一定要研究一下大佬们是怎么写的。