C语言二叉树层次遍历算法详解与实现

阿麦
阿麦
发布时间:2026-10-16 | 5人浏览过
原创

本文讲解如何使用C语言和链式队列实现二叉树的层次遍历。通过根节点入队并逐层扩展左右子节点的逻辑,确保按从上到下、从左到右的顺序访问每个节点一次。

什么是层次遍历

对于一颗二叉树,层次遍历是指从根节点开始,按照从上到下、从左到右的顺序访问每一个结点。在这个过程中,每个结点必须被且仅被访问一次。

实现原理

由于二叉树本身具有递归定义的特性,要实现非递归的层次遍历,最直接的工具是队列(Queue)。队列遵循“先进先出”(FIFO)的原则,这与层级遍历的顺序天然契合:

  1. 初始化:将根节点加入空队列。
  2. 循环处理:只要队列不为空,就取出队头节点进行访问,并将其左右孩子(如果存在)依次加入队尾。
  3. 结束条件:当队列变空时,说明所有层的节点均已被处理完毕。

第1步:定义数据结构

首先定义二叉树节点和链式队列的结构体。链式队列通过指针动态分配内存,便于管理。

typedef struct BTree {
	char data;
	struct BTree* lchild;
	struct BTree* rchild;
} Tree, *BiTree;

typedef struct Queue {
	BiTree data;
	struct Queue* next;
} Qnode, *Queueptr;

typedef struct point {
	Queueptr front; // 头指针
	Queueptr rear;  // 尾指针
} LinkQueue;

第2步:实现链式队列操作

包括初始化队列、入队、判断空队列以及出队四个核心函数。这些操作构成了遍历的基础工具。

// 初始化队列:创建头结点
void InitQueue(LinkQueue* qu) {
	qu->front = qu->rear = (Queueptr)malloc(sizeof(Qnode));
	if (qu->front == NULL)
		return;
}

// 入队操作:新节点连接在队尾
void enQueue(LinkQueue* qu, BiTree S) {
	if (S == NULL) return; // 空节点不入队
	Queueptr p = (Queueptr)malloc(sizeof(Qnode));
	if (p == NULL) return;
	p->data = S;
	p->next = NULL;
	qu->rear->next = p;
	qu->rear = p;
}

// 判断队列是否为空
int QueueEmpty(LinkQueue qu) {
	if (qu.front != qu.rear)
		return 1; // 非空
	else
		return 0; // 为空
}

// 出队操作:移除并返回队头元素
BiTree deQueue(LinkQueue* qu) {
	if (qu->front == qu->rear) return NULL;
	Queueptr p = qu->front->next;
	BiTree q = p->data;
	qu->front->next = p->next;
	if (qu->rear == p) 
		qu->rear = qu->front;
	free(p);
	return q;
}

第3步:主遍历逻辑与二叉树创建

结合上述队列操作,实现具体的层次遍历函数 ShowCengci,并通过递归方式创建测试用的二叉树。

BiTree InitTree() { // 二叉树的递归创建示例
	BiTree T = (BiTree)malloc(sizeof(Tree));
	char data;
	scanf("%c", &data); // 建议配合 getchar() 清理缓冲区
	if (data == '#') 
		return NULL;
	else {
		T->data = data;
		printf("请输入%c的左子树:\n", data);
		T->lchild = InitTree();
		printf("请输入%c的右子树:\n", data);
		T->rchild = InitTree();
	}
	return T;
}

void ShowCengci(BiTree T) {
	LinkQueue qu;
	InitQueue(&qu);
	if(T==NULL) return; // 防止空树传入
	enQueue(&qu, T); // 根节点入队
	while (QueueEmpty(qu)) {
		BiTree S = deQueue(&qu); // 节点出队
		printf("%c ", S->data);
		if (S->lchild != NULL) enQueue(&qu, S->lchild); // 左孩子入队
		if (S->rchild != NULL) enQueue(&qu, S->rchild); // 右孩子入队
	}
}

完成判断

当程序运行输出节点数据序列,且控制台无报错退出时,即表示层次遍历算法执行成功。输出顺序应符合该树的层级结构(例如:根 → 左子 → 右子 → 下一层最左...)。

简要总结

以上就是 C 语言利用队列实现二叉树层次遍历的详细内容。该方法通过标准的 BFS(广度优先搜索)思路,清晰地将树结构线性化,是掌握数据结构中递归与非递归转换的经典案例。更多关于 C 语言二叉树遍历的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表