树的遍历及遍历规则:
先序遍历:根左右
(即先访问根节点,在访问左儿子,最后访问右儿子)
中序遍历:左根右
后序遍历:左右根
层次遍历:按树的深度从小到大一层一层遍历
C++实现(递归):
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int dep[N];
int treedep=0;
vector<int> v[30];
struct node{
int v,Next;
}e[N*2];
int first[N];
int n,u1,v1,k=0;
void add(int ui,int vi){
++k; e[k].v=vi; e[k].Next=first[ui]; first[ui]=k;
}
void xianxu(int ui,int father){
printf("%d ",ui);
for(int i=first[ui];i;i=e[i].Next)
{
int vi=e[i].v; if(vi==father) continue;
xianxu(vi,ui);
}
}
void zhongxu(int ui,int father){
int root=ui,lchild=0,rchild=0;
for(int i=first[ui];i;i=e[i].Next)
{
int vi=e[i].v; if(vi==father) continue;
if(lchild) rchild=vi;
else lchild=vi;
}
if(lchild) zhongxu(lchild,root);
printf("%d ",root);
if(rchild) zhongxu(rchild,root);
}
void houxu(int ui,int father){
int root=ui,lchild=0,rchild=0;
for(int i=first[ui];i;i=e[i].Next)
{
int vi=e[i].v; if(vi==father) continue;
if(lchild) rchild=vi;
else lchild=vi;
}
if(lchild) houxu(lchild,root);
if(rchild) houxu(rchild,root);
printf("%d ",root);
}
void cengci(int ui,int father){
dep[ui]=dep[father]+1;
treedep=max(treedep,dep[ui]);
v[dep[ui]].push_back(ui);
int lchild=0,rchild=0;
for(int i=first[ui];i;i=e[i].Next)
{
int vi=e[i].v; if(vi==father) continue;
cengci(vi,ui);
}
}
int main(){
//freopen("tree.in","r",stdin);
//freopen("tree.out","w",stdout);
memset(first,0,sizeof(first));
memset(dep,0,sizeof(dep));
scanf("%d",&n);
for(int i=1;i<n;++i)
{
scanf("%d %d",&u1,&v1); add(u1,v1); add(v1,u1);
}
printf("pretravel:\n");
xianxu(1,0);
printf("\nmidtravel:\n");
zhongxu(1,0);
printf("\nsufftravel:\n");
houxu(1,0);
printf("\ndeptravel:\n");
cengci(1,0);
for(int i=1;i<=treedep;++i)
for(int j=0;j<v[i].size();++j) printf("%d ",v[i][j]);
//fclose(stdin); fclose(stdout);
return 0;
}