按先中后的顺序遍历就行了,因为是有向边,所以入度为0的为树的根
vector<vector<int>>e(N);
int d[N];
void dfs1(int x){//root left right
cout<<x<<" ";
if(e[x].empty())return ;
sort(e[x].begin(),e[x].end());
if(e[x].size()==1){
dfs1(e[x][0]);
}else{
dfs1(e[x][0]);
dfs1(e[x][1]);
}
}
void dfs2(int x){//left root right
if(e[x].empty()){
cout<<x<<" ";
return ;
}
if(e[x].size()==1){
if(e[x][0]>x){
dfs2(e[x][0]);
cout<<x<<" ";
}else{
cout<<x<<" ";
dfs2(e[x][0]);
}
}else{
dfs2(e[x][0]);
cout<<x<<" ";
dfs2(e[x][1]);
}
}
void dfs3(int x){//left root right
if(e[x].empty()){
cout<<x<<" ";
return ;
}
if(e[x].size()==1){
dfs3(e[x][0]);
cout<<x<<" ";
}else{
dfs3(e[x][0]);
dfs3(e[x][1]);
cout<<x<<" ";
}
}
void solve(){
int n;
cin>>n;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
e[u].push_back(v);
d[v]++;
}
int root;
for(int i=1;i<=n;i++){
if(d[i]==0)root=i;
}
dfs1(root);cout<<'\n';
dfs2(root);cout<<'\n';
dfs3(root);
}

京公网安备 11010502036488号