反转:可以在建树的时候左右子树反转
找根结点:结点添加是否有父结点的标记
其他常规
#include<iostream>
#include<queue>
using namespace std;
int f1=0,f2=0;
struct node
{
int data;
int left,right;
bool parent;
}num[10];
void levelorder(int x)
{
queue<int> Q;
Q.push(x);
while(!Q.empty())
{
int tmp=Q.front();
if(f1++==0) cout<<num[tmp].data;
else cout<<' '<<num[tmp].data;
Q.pop();
if(num[tmp].left!=-1)
Q.push(num[tmp].left);
if(num[tmp].right!=-1)
Q.push(num[tmp].right);
}
}
void inorder(int x)
{
if(x!=-1)
{
inorder(num[x].left);
if(f2++==0) cout<<num[x].data;
else cout<<' '<<num[x].data;
inorder(num[x].right);
}
}
int main()
{
int n;
char r,l;
cin>>n;
for(int i=0;i<n;i++)
{
num[i].parent=false;
}
for(int i=0;i<n;i++)
{
num[i].data=i;
cin>>l>>r;
if(l!='-')
{
num[i].right=l-'0';
num[l-'0'].parent=true;
}
else num[i].right=-1;
if(r!='-')
{
num[i].left=r-'0';
num[r-'0'].parent=true;
}
else num[i].left=-1;
}
int root;
for(root=0;root<n;root++)
{
if(num[root].parent==false)
break;
}
levelorder(num[root].data);
cout<<endl;
inorder(num[root].data);
}