PAT A1102 Invert a Binary Tree (25分)


反转树可以在构建树的过程中完成
层序遍历的方式类似于BFS

#include<cstdio>
#include<algorithm>
#include <vector>
#include<queue>
using namespace std;
const int N = 10;
struct node{
    int v;
    int left = -1;
    int right =-1;
}Node[N];
bool isroot[N];
vector<int> in,bfs;
int chartoint(char a){//0..9
    if(a>='0'&&a<='9'){
        return (a -'0');
    }else{
        return -1;
    }
}

void BFS(int root){
    if(root==-1) return;
    queue<int> q;
    q.push(root);
    while(q.empty()==false){
        int f = q.front();
        q.pop();
        if(Node[f].left!=-1)
            q.push(Node[f].left);
        if(Node[f].right!=-1)
            q.push(Node[f].right);
        bfs.push_back(f);
    }
    return;
}
void inOrder(int root){
    if(root==-1) return;    
    inOrder(Node[root].left);
    in.push_back(Node[root].v);
    inOrder(Node[root].right);        
    return;
}
int main(){
    int n;
    scanf("%d",&n);
    fill(isroot,isroot+N,true);//初始化
    for(int i = 0;i<n;i++){
        char l,r;
        getchar();//吸收\n
        scanf("%c %c",&l,&r);
        Node[i].left = chartoint(r);//插入时就更换左右子树的位置
        Node[i].right = chartoint(l);
        Node[i].v = i;
        if(Node[i].left!=-1) isroot[Node[i].left] = false;
        if(Node[i].right!=-1) isroot[Node[i].right] = false;
    }
    int root = -1;
    for(int i = 0;i<n;i++){
        if(isroot[i]==true){
            root = i;
            break;
        }
    }
    BFS(root);
    inOrder(root);
    for(int i = 0;i < n;i++){
        printf("%d",bfs[i]);
        if(i!=n-1) printf(" ");
    }
    printf("\n");
    for(int i = 0;i < n;i++){
        printf("%d",in[i]);
        if(i!=n-1) printf(" ");
    }
    return 0;
}


posted @ 2020-09-02 23:00  是水泵呢  阅读(70)  评论(0编辑  收藏  举报