1102 Invert a Binary Tree (25 分)
阿新 • • 發佈:2018-12-07
二叉樹有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; }