PAT甲级 1102 Invert a Binary Tree 反转树再层序中序输出

PAT甲级 1102 Invert a Binary Tree 反转树再层序中序输出_第1张图片
PAT甲级 1102 Invert a Binary Tree 反转树再层序中序输出_第2张图片

题意:

二叉树有N个节点(节点编号为0 ~ N-1),给出每个节点的左右孩子节点的编号,把该二叉树反转(即把每个节点的左右子树都交换),输出反转后二叉树的层序遍历序列和中序遍历序列。

思路:

我们可以在读入数据的时候就直接把左右子树互换,然后再层序和中序遍历即可。

代码如下:

#include
#include
#include
using namespace std;

struct tree{
   int key;
   int left;
   int right;
   tree(){
       left=right=-1;
   }
};

vector<tree> t;
int n;
int level[100],in[100];
int ans=0;
int flag[100]={0};

void level_traversal(int root){//层序遍历
    queue<tree> q;
    q.push(t[root]);
    while(!q.empty()){
        tree temp=q.front();
        level[ans++]=temp.key;
        if(temp.left>=0){
            q.push(t[temp.left]);
        }
        if(temp.right>=0){
            q.push(t[temp.right]);
        }
        q.pop();
    }
}

void in_order(int root){//中序遍历
    if(t[root].left>=0){
        in_order(t[root].left);
    }
    in[ans++]=t[root].key;
    if(t[root].right>=0){
        in_order(t[root].right);
    }
}

int main(){
    cin>>n;
    t.resize(n);
    char l,r;
    for(int i=0;i<n;i++){//在读入的时候就可以把左右子树互换
        cin>>l>>r;
        if(l!='-'){
            flag[l-'0']=1;
            t[i].right=l-'0';
        }
        if(r!='-'){
            flag[r-'0']=1;
            t[i].left=r-'0';
        }
        t[i].key=i;
    }

    int root;
    for(int i=0;i<n;i++){
        if(flag[i]==0){
            root=i;
            break;
        }
    }
    level_traversal(root);
    for(int i=0;i<n;i++){
        if(i!=n-1){
            cout<<level[i]<<" ";
        }else{
            cout<<level[i];
        }
    }
    cout<<endl;
    ans=0;
    in_order(root);
    for(int i=0;i<n;i++){
        if(i!=n-1){
            cout<<in[i]<<" ";
        }else{
            cout<<in[i];
        }
    }
    return 0;
}

你可能感兴趣的:(PAT,树)