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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据结构与算法学习笔记

    本文是王争老师的《算法与数据结构之美》的学习笔记,详细内容请看王争的专栏。有不懂的地方指出来,我做修改。数据结构与算法思维导图数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组方法”。数据结构是为算法服务的,算法是要作用再特定的数据结构上的。最常用的数据结构预算法:数据结构:数组、链表、栈、队列、散列表、二叉树‘、堆、跳表、图、Tire树 算法:递归…

    2022年4月7日
    210
  • MySQL默认事物隔离级别_sqlserver事务隔离级别

    MySQL默认事物隔离级别_sqlserver事务隔离级别mysql数据库事务的隔离级别有4个,而默认的事务处理级别就是【REPEATABLE-READ】,也就是可重复读。下面本篇文章就来带大家了解一下mysql的这4种事务的隔离级别,希望对大家有所帮助。SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。mysql的4种事务隔离级别,如下所示:…

    2022年9月11日
    0
  • 智能车浅谈——硬件篇

    智能车浅谈——硬件篇浅谈智能车制作

    2022年7月22日
    8
  • 计算机蓝屏代码0x000000ED,电脑蓝屏代码0x000000ed解决步骤[通俗易懂]

    计算机蓝屏代码0x000000ED,电脑蓝屏代码0x000000ed解决步骤[通俗易懂]电脑蓝屏代码现象是我们在使用电脑中最常见的一种启动问题,令小白用户很头痛。比如,我们在启动电脑的时候,它并没有正常地启动,屏幕反而一片蓝色,出现了一串奇怪的代码:0x000000ed,怎么办?下面,小编给大伙演示电脑蓝屏代码0x000000ed的修复流程。电脑蓝屏代码0x000000ed怎么解决蓝屏代码0x000000ed原因分析:一般是由于磁盘存在错误导致的。有可能是电脑非常关机导致系统错误,…

    2022年10月8日
    0
  • django formview_DWG TrueView

    django formview_DWG TrueViewAPIView视图类在DRF中,推荐使用类视图,因为类视图可以通过继承的方式把一些重复性的工作抽取出来,而使得代码更加简洁。当然如果你不想使用类视图,那么就用@api_view装饰器包裹一下就可以。

    2022年7月31日
    3

发表回复

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

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