1. 程式人生 > >1102 Invert a Binary Tree (25 分)

1102 Invert a Binary Tree (25 分)

二叉樹有N個結點,給出每個結點的左右孩子結點的編號,把二叉樹反轉(左右孩子交換  所以是後序遍歷交換) 輸出反轉後二叉樹的層序遍歷和中序遍歷

#include<bits/stdc++.h>

using namespace std;
const int N=110;
struct node
{
    int L,R;
}s[N];
int toint(char ch)
{
    if(ch=='-'){
        return -1;
    }
    else{
        return ch-'0';
    }

}
int isroot[N];
void postorder(int root) { if(root==-1){ return; } postorder(s[root].L); postorder(s[root].R); swap(s[root].L,s[root].R); } vector<int>in; void print(int root) { if(root!=-1){ print(s[root].L); in.push_back(root); print(s[root].R); } } vector
<int>le; void lever(int root) { queue<int>Q; Q.push(root); while(!Q.empty()){ int u=Q.front(); Q.pop(); le.push_back(u); if(s[u].L!=-1) Q.push(s[u].L); if(s[u].R!=-1) Q.push(s[u].R); } } int main() { fill(isroot,isroot+N,false);
int n; scanf("%d",&n); for(int i=0;i<n;i++){ char ch1,ch2; scanf("%*c%c %c",&ch1,&ch2); int a=toint(ch1); int b=toint(ch2); s[i].L=a; s[i].R=b; isroot[a]=true; isroot[b]=true; } int root=0; for(int i=0;i<n;i++){ if(isroot[i]==false){ root=i; } } postorder(root); print(root); lever(root); for(int i=0;i<le.size();i++){ if(i) printf(" "); printf("%d",le[i]); } printf("\n"); for(int i=0;i<in.size();i++){ if(i) printf(" "); printf("%d",in[i]); } printf("\n"); return 0; }