前言
- 通常对于一颗树有四种遍历方式,先序遍历,中序遍历,后序遍历,层序遍历,分别对应着:根左右,左根右,左右根,层(类bfs队列实现)
题意
思路
- 由题意,给定一个节点的父亲和该节点的左右位置,可以使用一个结构体数组来存储
- 对于前三种遍历方式,使用递归即可实现
- 对于最后一种方式,维护一个队列,pop的同时把该节点的两个儿子加入队列,直到队列为空
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef struct{
int l,r;
}TREE;
TREE a[505050];
int vis[505050];
void fst(int rt){
if(rt!=0)printf("%d ",rt);
if(a[rt].l!=0) fst(a[rt].l);
if(a[rt].r!=0) fst(a[rt].r);
}
void mid(int rt){
if(a[rt].l!=0) mid(a[rt].l);
if(rt!=0)printf("%d ",rt);
if(a[rt].r!=0) mid(a[rt].r);
}
void lst(int rt){
if(a[rt].l!=0) lst(a[rt].l);
if(a[rt].r!=0) lst(a[rt].r);
if(rt!=0)printf("%d ",rt);
}
void flr(int rt){
queue<int> b;
b.push(rt);
while(!b.empty()){
printf("%d ",b.front());
if(a[b.front()].l!=0)b.push(a[b.front()].l);
if(a[b.front()].r!=0)b.push(a[b.front()].r);
b.pop();
}
}
int main(){
int n,u,v,op;
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d%d%d",&u,&v,&op);
if(op)a[v].r=u;
else a[v].l=u;
vis[u]=1;
}
int root;
for(int i=1;i<=n;i++)if(!vis[i])root=i;
fst(root);
printf("\n");
mid(root);
printf("\n");
lst(root);
printf("\n");
flr(root);
}