A1102 | 反转二叉树

Posted TQCAI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

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

以上是关于A1102 | 反转二叉树的主要内容,如果未能解决你的问题,请参考以下文章

十三:反转二叉树

在 C++ 中反转二叉树

leetCode题解之反转二叉树

DS二叉树—二叉树镜面反转

需要帮助跟踪二叉树的这种反转方法

L2-011. 玩转二叉树