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; }