A1102 | 反转二叉树

 

#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

超简单的一道题,居然写了一个小时,还写了一百多行……明天一定要研究一下大佬们是怎么写的。


 

看了蓝书之后才知道原来可以这么写。

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;
}

 

posted @ 2018-01-03 21:38  TQCAI  阅读(254)  评论(0编辑  收藏  举报