zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    投影变换 到 uv坐标 xy/w 齐次坐标
    GdiPlus[19]: IGPPathGradientBrush 之 SetCenterPoint
    GdiPlus[21]: IGPPathGradientBrush 之 InterpolationColors
    GdiPlus[24]: IGPPrivateFontCollection: 分别从文件和内存加载字体
    GdiPlus[23]: IGPFontFamily
    GdiPlus[25]: IGPInstalledFontCollection: 获取已安装的字体列表
    GdiPlus[20]: IGPPathGradientBrush 之 SetFocusScales
    GdiPlus[22]: IGPFont
    可爱的 CreateMessageDialog
    GdiPlus[18]: IGPPathGradientBrush 之 CenterColor、SurroundColors
  • 原文地址:https://www.cnblogs.com/TQCAI/p/8185808.html
Copyright © 2011-2022 走看看