数据结构 — 6.顺序队列(循环)实现二叉树层次遍历

【问题描述】编写按层次顺序(同一层自左至右)遍历二叉树的算法


【输入形式】A B * C * * D * *  


【输出形式】A B D C


/*
    1.顺序循环队列
    2.二叉树先序创建
    3.二叉树层次遍历(队列实现)
*/

#include<stdio.h>
#include<iostream>
#include<malloc.h>
#define MAX 50

using namespace std;

/* 二叉树结构 */
typedef struct BTree{
	char data;
	struct BTree *lchild,*rchild;
}BiTNode,*BiTree;

/* 顺序队列 */
typedef struct {
	BiTree qu[MAX];
	int front,rear;
}Queue;

/* 先序创建 二叉树 */
void CreatBinaryTree(BiTree &T){
    //输入的字符
	char ch;
	scanf("%c",&ch);

	//叶子结束符 ‘*’
	if(ch=='*') T = NULL;
	else{
        //分配内存
		T=(BiTNode *)malloc(sizeof(BiTNode));
		//T = (BiTree)malloc(sizeof(BiTNode));
        //数据域
		T->data = ch;
        //递归创建左右子树
		CreatBinaryTree(T->lchild);
		CreatBinaryTree(T->rchild);
	}
}

/* 队列初始化 */
void InitQueue(Queue &q){//‘&’ 引用传递 !
    q.front = 0;
    q.rear = 0;
}

/* 从尾部入队 */
void EnterQueue(Queue &q,BiTree &p){
    //取余 -> 队列是否排满
	if((q.rear+1)%MAX != q.front){
        //队尾入队
		q.qu[q.rear] = p;
        //队尾下标后移
		q.rear = (q.rear+1)%MAX;
	}
}

/* 从队头出队 */
void QuitQueue(Queue &q,BiTree &p){

	if(q.front != q.rear){
        //将数据域中的数据取出来
		p = q.qu[q.front];
        //队头下标后移
		q.front = (q.front + 1)%MAX;
	}
}//注意!在处理队头队尾下标时不要忘了取余

/* 二叉树层次遍历 */
void FloorTraverse(BiTree &T){
	// 一个二叉树操作结点、 一个队列
	BiTree p;
	Queue q;

	//初始化
	p = T;
	InitQueue(q);

	if(p){
        //将二叉树根节点入队
        EnterQueue(q, p);
        //队列 为空是循环结束条件 -> 队列进队出队顺序就是层次遍历的顺序
        while(q.front != q.rear){
            //出队、 访问(visit)
			QuitQueue(q,p);
			cout<<p->data;
            //将此节点的左右子树分别从队尾入队
			if(p->lchild)
			EnterQueue(q,p->lchild);
			if(p->rchild)
			EnterQueue(q,p->rchild);
		}
	}
}

/* 主函数 */
int main(){
    BiTree T;
    CreatBinaryTree(T);
    FloorTraverse(T);
    return 0;
}


  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
精心整理史上最全的数据结构flash演示动画,共5个版本,祝大家考研成功! \数据结构flash演示\版本1 \数据结构flash演示\版本2 \数据结构flash演示\版本3 \数据结构flash演示\版本4 \数据结构flash演示\版本5 \数据结构flash演示\版本1\1-4 算法算法分析 冒泡排序.swf \数据结构flash演示\版本1\10-1-1插入排序.swf \数据结构flash演示\版本1\10-2-2直接插入排序.swf \数据结构flash演示\版本1\10-2-3折半插入排序.swf \数据结构flash演示\版本1\10-2-4-1直接插入排序.swf \数据结构flash演示\版本1\10-2-4表插入排序.swf \数据结构flash演示\版本1\10-2-5希尔排序.swf \数据结构flash演示\版本1\10-3-1起泡排序.swf \数据结构flash演示\版本1\10-3-2起泡排序.swf \数据结构flash演示\版本1\10-3-4快速排序.swf \数据结构flash演示\版本1\10-4-2堆排序大顶堆.swf \数据结构flash演示\版本1\10-4-3堆排序大顶堆.swf \数据结构flash演示\版本1\10-4-4堆排序建立堆.swf \数据结构flash演示\版本1\10-5-2归并排序.swf \数据结构flash演示\版本1\10-6-1多关键字排序.swf \数据结构flash演示\版本1\10-6-2分配收集.swf \数据结构flash演示\版本1\10-6-3分配收集2.swf \数据结构flash演示\版本1\10-6-4计数排序.swf \数据结构flash演示\版本1\2-2-1顺序表的查找.swf \数据结构flash演示\版本1\2-2-2顺序表的插入演示.swf \数据结构flash演示\版本1\2-2-3顺序表的插入算法.swf \数据结构flash演示\版本1\2-2-4顺序表的删除演示.swf \数据结构flash演示\版本1\2-2-5顺序表的删除算法.swf \数据结构flash演示\版本1\2-2-6.swf \数据结构flash演示\版本1\2-2-7.swf \数据结构flash演示\版本1\2-2-8.swf \数据结构flash演示\版本1\2-2-9.swf \数据结构flash演示\版本1\2-3-1.1单链表删除节点.swf \数据结构flash演示\版本1\2-3-1.2单链表插入节点.swf \数据结构flash演示\版本1\2-3-1单链表getElem.swf \数据结构flash演示\版本1\2-3-2单链表头插法.swf \数据结构flash演示\版本1\2-3-3.swf \数据结构flash演示\版本1\2-3-4.swf \数据结构flash演示\版本1\2-3-5带头结点的双向循环链表.swf \数据结构flash演示\版本1\2-3-6双向链表的插入.swf \数据结构flash演示\版本1\2-3-7双向链表的删除.swf \数据结构flash演示\版本1\2-3-8.swf \数据结构flash演示\版本1\2-3-9两个有序链表的连接.swf \数据结构flash演示\版本1\3-2-1栈的应用举例-进制转换.swf \数据结构flash演示\版本1\3-3-10链队列.swf \数据结构flash演示\版本1\3-3-11链队列-入队.swf \数据结构flash演示\版本1\3-3-12-1链队列出队.swf \数据结构flash演示\版本1\3-3-12-2链队列出队-队列空.swf \数据结构flash演示\版本1\3-3-13循环队列.swf \数据结构flash演示\版本1\3-3-1栈的应用举例-走迷宫-有解.swf \数据结构flash演示\版本1\3-3-2栈的应用举例-走迷宫-无解.swf \数据结构flash演示\版本1\3-3-4后缀式.swf \数据结构flash演示\版本1\3-3-5后缀式.swf \数据结构flash演示\版本1\3-3-6后缀式.swf \数据结构flash演示\版本1\3-3-7后缀式.swf \数据结构flash演示\版本1\3-3-9栈的应用举例-汉诺塔.swf \数据结构flash演示\版本1\3-4-1杨辉三角.swf \数据结构flash演示\版本1\3-4-2离散事件模拟.swf \数据结构flash演示\版本1\4-1-1串的定位操作.swf \数据结构flash演示\版本1\4-1-2串的替换.s
二叉树层次遍历是指按照树的层次依次访问每个节点的操作。在递归实现中,可以使用循环队列实现层次遍历循环队列是一种先进先出的数据结构,可以在遍历过程中按层次顺序存储和访问节点。 首先,需要先序递归遍历法建立二叉树的二叉链表存储结构。这可以使用先序遍历的方式构建二叉树,先访问根节点,然后递归构建左子树和子树。 接下来,可以使用循环队列实现层次遍历循环队列的基本操作包括入队和出队。在层次遍历中,需要将根节点入队,然后在循环中进行以下步骤:出队一个节点,访问该节点,然后将其左子节点入队。直到队列为空,遍历结束。 通过以上步骤,就可以实现二叉树层次遍历(递归实现)并使用循环队列辅助完成。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [二叉树(前序,中序,后序,层序)遍历递归与循环的python实现](https://blog.csdn.net/weixin_39574469/article/details/119576908)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [数据结构实验报告6-树-二叉树遍历算法-实验内容及要求.docx](https://download.csdn.net/download/weixin_42795141/11290598)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PeersLee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值