1. 程式人生 > >A1102 | 反轉二叉樹

A1102 | 反轉二叉樹

for oid amp define string bstr root log opened

技術分享圖片
#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; }
View Code

超簡單的一道題,居然寫了一個小時,還寫了一百多行……明天一定要研究一下大佬們是怎麽寫的。

A1102 | 反轉二叉樹