树形结构的层次遍历:
结构体定义:
typedef struct Tnode
{
int data;
struct Tnode *lchil,*rchil;
}Tnode,*Tree;
typedef struct QNode
{
Tnode* node;
struct QNode *next;
}QNode;
typedef struct link_queue
{
QNode *rear,*font;
}link_queue;
遍历树节点函数:
void printTree(Tree T){
if(T!=NULL){
printTree(T->lchil);
printf("%d ",T->data);
printTree(T->rchil);
}
}
链栈初始化:
void InitQueue(link_queue *Q){
Q->font = Q->rear = (QNode *)malloc(sizeof(QNode));
Q->font->next = NULL;
}
入队操作:
bool EnQueue(link_queue *Q,Tnode *e){
QNode* p = (QNode *)malloc(sizeof(QNode));
p->node = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
return true;
}
出队操作:
bool DeQueue(link_queue *Q,Tnode **e){
if(Q->font == Q->rear){
return false;
}
QNode* p = Q->font->next;
*e = p->node;
Q->font->next = p->next;
if(p->next == NULL){
Q->rear = Q->font;
}
free(p);
return true;
}
判断队空:
bool emptyQueue(link_queue q){
if(q.font == q.rear){
return true;
}
return false;
}
树节点初始化创建:
void createNode(Tnode *node, int e){
node->data = e;
node->lchil = node->rchil = NULL;
}
层次遍历函数主体:
void printLevel(Tree T){
printf("中序遍历\n");
printTree(T);
printf("\n");
Tnode **s,*p;
link_queue q;
InitQueue(&q);
EnQueue(&q,T);
while (!emptyQueue(q))
{
DeQueue(&q,s);
p = *s;
printf("%d ",p->data);
if(p->lchil != NULL){
EnQueue(&q,p->lchil);
}
if(p->rchil != NULL){
EnQueue(&q,p->rchil);
}
}
printf("\n队列输出完成\n");
}
主函数:
- 这里因为暂时还没学到用前序、中序队列创建二叉树,所以采用手动创建二叉树的方式
int main(){
Tree T;
T = (Tnode *)malloc(sizeof(Tnode));
createNode(T,1);
Tnode n1;
Tnode n2;
Tnode n3;
Tnode n4;
Tnode n5;
Tnode n6;
createNode(&n1,2);
createNode(&n2,3);
createNode(&n3,4);
createNode(&n4,5);
createNode(&n5,6);
createNode(&n6,7);
T->lchil = &n1;
T->rchil = &n2;
n1.lchil = &n6;
n1.rchil = &n4;
n2.rchil = &n5;
n5.lchil = &n3;
printLevel(T);
}