c语言实现二叉树层序遍历

c语言实现二叉树层序遍历 按层序遍历原则,应打印ABCDEFG,如何实现?1.使用队列,队列是先进先出,首先把A放进去,然后如果队列有元素,就出队A,然后把出队元素A的左右BC节点入队,然后B出队,把B的左右节点放进去(没有就继续出队C),C出队,把DE放进去,D出队,E出队,把FG放进去,然后出FG(因为FG左右节点没有数据,不用入队),循环条件是队列不能为空(才能实现出队操作)核心源码:voidLev…

大家好,又见面了,我是你们的朋友全栈君。

c语言实现二叉树层序遍历 按层序遍历原则,应打印ABCDEFG,如何实现?

1.使用队列,队列是先进先出,首先把A放进去,然后如果队列有元素,就出队A,然后把出队元素A的左右BC节点入队,然后B出队,把B的左右节点放进去(没有就继续出队C),C出队,把DE放进去,D出队,E出队,把FG放进去,然后出FG(因为FG左右节点没有数据,不用入队),循环条件是队列不能为空(才能实现出队操作)

核心源码:

void LevelOrderBinaryTree(pTreeNode t){
	pQueue pq=(pQueue)malloc(sizeof(Queue));
	pq=init(pq);
	enqueue(pq,t);
	while(pq->rear!=pq->front){
		pTreeNode x=dequeue(pq);
		printf("%d ",x->data);
		if(x->left){
			enqueue(pq,x->left);
		}
		if(x->right){
			enqueue(pq,x->right);
		}
	}
}

注意:(1).队列不为空即front不等于rear

(2).逻辑要缜密,要出队,实现队列不能为空是把,要入队,首先入队元素不能为空是把

(3).入队后出队,出队要把元素输出(data),然后要把该元素的left,right节点入队,所以要把pTreeNode节点存进去,出队返回该树节点,然后输出该节点的数据,最后把他的左右节点入队

(4).声明结构体,最好多加个结构体指针,在函数传入,只需4个字节,提高效率,不用把整个结构体传进去

完整代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct TreeNode{
	TreeNode *left;
	TreeNode *right;
	int data;
}TreeNode,*pTreeNode;

typedef struct QueueNode{
	pTreeNode data;
	QueueNode *next;
}QueueNode,*pQueueNode;

typedef struct Queue{
	pQueueNode front;
	pQueueNode rear;
}Queue,*pQueue;

void create(pTreeNode *t){
	int ch;
	scanf_s("%d",&ch);
	if(ch==-1){
		(*t)=NULL;
		return;
	}else{
		(*t)=(pTreeNode)malloc(sizeof(TreeNode));
		(*t)->data=ch;
		printf("请输入%d的左节点数据:",ch);
		create(&((*t)->left));
		printf("请输入%d的右节点数据:",ch);
		create(&((*t)->right));
	}
}

pQueue init(pQueue pq){
	pq->front=(pQueueNode)malloc(sizeof(QueueNode));
	pq->front->next=NULL;
	pq->rear=pq->front;
	return pq;
}

void enqueue(pQueue pq,pTreeNode t){
	pQueueNode pNew=(pQueueNode)malloc(sizeof(QueueNode));
	pNew->data=t;
	pNew->next=NULL;
	pq->rear->next=pNew;
	pq->rear=pNew;
}

pTreeNode dequeue(pQueue pq){
	pQueueNode pTemp=(pQueueNode)malloc(sizeof(QueueNode));
	pTemp=pq->front->next;
	if(pTemp->next==NULL){
		pq->rear=pq->front;
	}else{
		pq->front->next=pTemp->next;
	}
	pTreeNode x=pTemp->data;
	free(pTemp);
	return x;
}

void LevelOrderBinaryTree(pTreeNode t){
	pQueue pq=(pQueue)malloc(sizeof(Queue));
	pq=init(pq);
	enqueue(pq,t);
	while(pq->rear!=pq->front){
		pTreeNode x=dequeue(pq);
		printf("%d ",x->data);
		if(x->left){
			enqueue(pq,x->left);
		}
		if(x->right){
			enqueue(pq,x->right);
		}
	}
}
void main(){
	pTreeNode t;
	printf("请输入第一个节点数据,-1代表没数据:");
	create(&t);
	system("pause");
	printf("层序遍历如下:");
	LevelOrderBinaryTree(t);
	system("pause");
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143210.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 中间人攻击(MITM)姿势总结[通俗易懂]

    中间人攻击(MITM)姿势总结[通俗易懂]相关学习资料 http://www.cnblogs.com/LittleHann/p/3733469.htmlhttp://www.cnblogs.com/LittleHann/p/3738141.htmlhttp://www.cnblogs.com/LittleHann/p/3741907.htmlhttp://www.cnblogs.com/LittleHann/p/37082…

    2025年7月10日
    3
  • linux tcptraceroute tcpping安装使用

    linux tcptraceroute tcpping安装使用1.首先安装依赖包libpcapyuminstall-ylibpcap2.下载tcptracerouterpm包,并安装rpm-ivhtcptraceroute-1.5-0.beta7.el6.rf.x86_64.rpmtcptraceroute121.46.29.1155810-n-q1tracerouteto121….

    2022年6月20日
    52
  • 用Java实现QQ登录[通俗易懂]

    用Java实现QQ登录[通俗易懂]Java实现QQ登录写了一个个人网站,增加一个登录的地方,自己写登录太麻烦,而且用户一般也不愿意去登录,接入QQ互联,实现QQ一键登录。所有前提是你得有一个IP地址和域名。==ps:==用处不大,主要是写着玩1进入qq互联官网进入点击头像个创建提交申请2选择个人接入,按照步骤填写注册资料创建成功通过后会哦显示接入的个人信息。3审核成功后点击下面的开始创建,按步骤完成创建过程。4创建成功后可以查看APPID和APPkey,很重要在应用管理界面可以查看如上信息,点击查看就可以

    2022年7月7日
    25
  • HTTP常见端口_8443端口

    HTTP常见端口_8443端口常见端口地点HTTP服务器,默认的端口号为80/tcp(木马Executor开放此端口);HTTPS(securelytransferringwebpages)服务器,默认的端口号为443/tcp443/udp;Telnet(不安全的文本传送),默认端口号为23/tcp(木马TinyTelnetServer所开放的端口);FTP,默认的端口号为21/tcp(木马DolyTro…

    2022年9月18日
    2
  • python resize函数怎么用_python cv2.resize函数high和width注意事项说明「建议收藏」

    在opencv中获取图片的尺寸的方法是:importcv2img=cv2.imread(path)img.shape返回的是三维数组(high,width,3),当我们需要对图像进行缩放时需要用到cv2.resize()函数:#缩放到原来的二分之一img=cv.resize(img,(int(width/2),int(high/2)))此时需要传入的形状又是(width,…

    2022年4月14日
    145
  • 零拷贝技术_基因单拷贝

    零拷贝技术_基因单拷贝零拷贝技术概述零拷贝技术指在计算机执行操作时,CPU不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文切换以及CPU的拷贝时间。它的作用是在数据报从网络设备到用户程序空间传递的过程中,减少数据拷贝次数,减少系统调用,实现CPU的零参与,彻底消除CPU的负载。实现零拷贝用到的主要技术是DMA数据传输技术和内存区域映射技术零拷贝机制可以减少数据在内核缓冲区和用户进程缓冲区之间反复的I/O拷贝操作零拷贝机制可以减少用户进程地址空间之间因为上下文切换而带来的CPU开销物理内存和虚拟

    2022年9月21日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号