树的遍历及遍历规则:
先序遍历:根左右
(即先访问根节点,在访问左儿子,最后访问右儿子)
中序遍历:左根右
后序遍历:左右根
层次遍历:按树的深度从小到大一层一层遍历
C++实现(递归):
#includeusing namespace std; const int N=1e6+5; int dep[N]; int treedep=0; vector 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 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



