#include<iostream>
#include<queue>
using namespace std;
struct Node
{
int lchild;
int rchild;
}node[110];
bool isnotroot[110]={false};
int n,num=0;
void print(int id)
{
cout<<id;
num++;
if(num!=n)
cout<<' ';
else
cout<<endl;
}
void inorder(int root)
{
if(root==-1)
return ;
inorder(node[root].lchild);
print(root);
inorder(node[root].rchild);
}
void postorder(int root)
{
if(root==-1)
return;
postorder(node[root].lchild);
postorder(node[root].rchild);
swap(node[root].lchild,node[root].rchild);
}
void BFS(int root)
{
queue<int> q;
q.push(root);
while(!q.empty())
{
int temp=q.front();
q.pop();
print(temp);
if(node[temp].lchild!=-1)
q.push(node[temp].lchild);
if(node[temp].rchild!=-1)
q.push(node[temp].rchild);
}
}
int strtonum(char c)
{
if(c=='-')
return -1;
else
{
isnotroot[c-'0']=true;
return c-'0';
}
}
int findroot()
{
for(int i=0;i<n;i++)
if(isnotroot[i]==false)
return i;
}
int main()
{
char lchild,rchild;
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%*c%c %c",&lchild,&rchild);
node[i].lchild=strtonum(lchild);
node[i].rchild=strtonum(rchild);
}
int root=findroot();
postorder(root);
BFS(root);
num=0;
inorder(root);
return 0;
}
反转二叉树只需要进行后序遍历,在后序遍历访问根节点时进行子树交换即可