重学数据结构:树的层序遍历(C语言)

树的层序遍历

顾名思义,就是一层一层的输出内容。要实现这个功能,需要用到我们之前学到的队列的相关操作。以二叉树为例,,根节点先输出,遍历所有节点,把当前节点的左右子节点也加入队列,若当前列队不为空,则输出队头节点,并获取对头节点的左右子节点加入队列,直到队列为空。
在这里插入图片描述

层序遍历代码
//层序遍历
bool LevelOrder(BiTree tree)
{
    if(tree==NULL) return false;
	LinkQueue *Q=(LinkQueue *)malloc(sizeof(LinkQueue));
    InitLinkQueue(Q);
	EnLinkQueue(Q,tree);
    BiNode *cur_Node=tree;

    while(!IsLinkQueueEmpty(Q))
	{
		cur_Node=DeLinkQueue(Q);
		if(cur_Node->left!=NULL)EnLinkQueue(Q,cur_Node->left);
        if(cur_Node->right!=NULL)EnLinkQueue(Q,cur_Node->right);
	    
	}
	return true;
}
测试代码
int main(int argc, char* argv[])
{
   BiTree tree;
   InitTree(tree);
   LevelOrder(tree);
   return 0;
}
测试结果
入队1
出队1
入队2
入队3
出队2
入队4
入队5
出队3
入队6
出队4
入队7
出队5
出队6
出队7
其他用到的代码
#include "stdafx.h"
#include "stdlib.h"
#include "string.h"
#define MaxSize 50
#define bool int
#define true 1
#define false 0;

typedef struct BiNode
{
    int data;
	struct BiNode *left,*right;
}BiNode,*BiTree;

typedef struct LNode
{
   struct LNode *next;
   BiNode *data;
}LNode;

typedef struct
{
   LNode *front,*rear;
}LinkQueue;


void InitLinkQueue(LinkQueue *Q)
{
    Q->front=Q->rear=(LNode *)malloc(sizeof(LNode));
    Q->front->next=NULL;
}
bool IsLinkQueueEmpty(LinkQueue *Q)
{
    if(Q->front==Q->rear)
        return true;
    else
        return false;
}


bool EnLinkQueue(LinkQueue *Q,BiNode *e)
{
    
    LNode *newNode=(LNode *)malloc(sizeof(LNode));
    newNode->data=e;
    newNode->next=NULL;
    printf("入队%d\n",e->data);
    Q->rear->next=newNode;
    Q->rear=newNode;
    
    return true;
}


BiNode* DeLinkQueue(LinkQueue *Q)
{
    //if(IsLinkQueueEmpty(Q))return null;
    LNode *newNode=Q->front->next;
    Q->front->next=newNode->next;
	printf("出队%d\n",newNode->data->data);
    BiNode *e=newNode->data;
    if(newNode==Q->rear)
        Q->rear=Q->front;
    free(newNode);
    return e;
}




bool visit(BiTree tree)
{
   printf("%d->",tree->data);
   return true;
}

void InitTree(BiTree &root)
{
   root=(BiTree)malloc(sizeof(BiNode));
   root->left=(BiNode *)malloc(sizeof(BiNode));
   root->right=(BiNode *)malloc(sizeof(BiNode));
   root->data=1;
   root->left->data=2;
   root->right->data=3;

   root->left->left=(BiNode *)malloc(sizeof(BiNode));
   root->left->right=(BiNode *)malloc(sizeof(BiNode));
   root->left->left->data=4;
   root->left->right->data=5;
   root->left->right->left=NULL;
   root->left->right->right=NULL;

   root->right->left=(BiNode *)malloc(sizeof(BiNode));
   root->right->right=NULL;
   root->right->left->data=6;
   root->right->left->left=NULL;
   root->right->left->right=NULL;

   root->left->left->left=NULL;
   root->left->left->right=(BiNode *)malloc(sizeof(BiNode));
   root->left->left->right->data=7;
   root->left->left->right->left=NULL;
   root->left->left->right->right=NULL;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值