通用树的遍历算法,适合所有的树
/*树的遍历,通用算法*/
#include<stdio.h>
typedef struct E_node{
char data;
struct E_node *child[M];//M为树的度
}E_NODE;
void pre_print(E_NODE *T)//前序遍历M次树
{
int i;
if(T!=NULL)
{
printf("%d,",T->data);
for(i=0;i<M;i++)
{
pre_print(T->child[i]);
}
}
}
void pre_print2(E_NODE *T)//非递归前序遍历
{
E_NODE *s[100];//栈元素最多100个,假设不会溢出
int top,i;
if(T==NULL)
{
return;
}
s[0]=T;
top=1;//树的根结点进栈
while(top>0)
{
T=s[--top];//取出栈节点为当前处理结点
printf("%d,",T->data);
for(i=M-1;i>=0;i--)//对于当前队列从右到左各子树
{
if(T->child[i]!=NULL)
s[top++]=T->child[i];//子树根结点进栈
}
}
}
void level(E_NODE *T)//层次访问
{
E_NODE *q[100];
E_NODE *p;
int head;
int rear;
int i;
if(T==NULL)
return ;
q[0]=T;//树根结点入队
head=0;
rear=1;
while(head<rear)//队列非空
{
p=q[head++];//取出队结点为当前处理结点
printf("%d,",T->data);
for(i=0;i<M;i++)//对于当前结点从左到右各子树
{
if(p->child[i]!=NULL)
{
q[rear++]=p->child[i];//子根结点入队
}
}
}
}