#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; }
超简单的一道题,居然写了一个小时,还写了一百多行……明天一定要研究一下大佬们是怎么写的。
看了蓝书之后才知道原来可以这么写。
1.静态二叉树数据结构,左右叶子结点直接用Node数组的下标记录,空结点就记录1(在结构体中直接初始化为1)
2.反转二叉树的操作实际上是后序遍历
3.查找根节点的方法:先把数据都记录到Node数组中,在录数据的时候记录出现的叶子节点的ID,让isLeaf[ID]=0,这样直接找到整棵树都不是叶子的节点,就是根节点。
#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 200 #define MAX 0x06FFFFFF #define V vector<int> using namespace std; typedef struct Node{ int l=-1,r=-1; }Node; Node nodes[LEN]; int isLeaf[LEN]; int n; int cnt; int getRoot(){ int i; FF(i,n){ if(isLeaf[i]==0) return i; } } void buildTree(int i,char l,char r){ if(l!='-'){ int i_l=l-48; nodes[i].l=i_l; isLeaf[i_l]=1; } if(r!='-'){ int i_r=r-48; nodes[i].r=i_r; isLeaf[i_r]=1; } } void print(int id){ O("%d",id); if(++cnt<n) O(" "); } void invert(int i){ if(i>=0){ invert(nodes[i].l); invert(nodes[i].r); swap(nodes[i].l,nodes[i].r); } } void bfs(int root){ cnt=0; queue<int> q; q.push(root); while(!q.empty()){ int t=q.front(); q.pop(); print(t); if(nodes[t].l>=0) q.push(nodes[t].l); if(nodes[t].r>=0) q.push(nodes[t].r); } } void inOrder(int i){ if(i>=0){ inOrder(nodes[i].l); print(i); inOrder(nodes[i].r); } } int main(){ freopen("d:/input/A1102.txt","r",stdin); scanf("%d",&n); int i=n; FF(i,n){ char l,r; scanf("%*c%c %c",&l,&r); buildTree(i,l,r); } int root=getRoot(); invert(root); bfs(root);OL(""); cnt=0;inOrder(root);OL(""); return 0; }