- 二叉树的的存储:对于节点i,有左孩子l[i],右孩子r[i]
- 二叉树反转:dfs遍历,对每个点交换左右子树
- 层次遍历用队列
- 中序用递归
#include<bits/stdc++.h>
using namespace std;
const int maxn = 15;
int n,k;
int l[maxn],r[maxn];
bool fa[maxn];
queue<int> q;
void invert(int x) {
if(l[x]==-1 && r[x]==-1) return;
swap(l[x],r[x]);
if(l[x]!=-1) invert(l[x]);
if(r[x]!=-1) invert(r[x]);
}
void levelorder() {
int tmp = q.front();
cout << tmp;
while(q.size()) {
int t = q.front();q.pop();
int x = l[t],y = r[t];
if(x != -1) {
cout << " "<<x;
q.push(x);
}
if(y != -1) {
cout << " "<<y;
q.push(y);
}
}
}
void inorder(int x) {
int a = l[x],b = r[x];
if(a!=-1) {
inorder(a);
}
cout << x ;
k ++;
if(k!=n) cout <<" ";
if(b!=-1) {
inorder(b);
}
}
int main()
{
cin >> n;
memset(l,-1,sizeof(l));
memset(r,-1,sizeof(r));
for(int i=0;i<n;i++) {
char x,y;
cin >> x >> y;
if(x!='-') l[i]=(x-'0'),fa[x-'0']=1;
if(y!='-') r[i]=(y-'0'),fa[y-'0']=1;
}
int root = -1;
for(int i=0;i<n;i++) if(!fa[i]) root = i;
invert(root);
q.push(root);
levelorder();
cout << endl;
inorder(root);
return 0;
}