【算法导论】二叉树的广度优先遍历

简介: 二叉树的广度优先遍历 广度优先遍历:又称按层次遍历,也就是先遍历二叉树的第一层节点,然后遍历第二层节点……最后遍历最下层节点。而对每一层的遍历是按照从左至右的方式进行的。

二叉树的广度优先遍历

广度优先遍历:又称按层次遍历,也就是先遍历二叉树的第一层节点,然后遍历第二层节点……最后遍历最下层节点。而对每一层的遍历是按照从左至右的方式进行的。
基本思想:按照广度优先遍历的方式,上一层中先被访问的节点,它的下层孩子也必然先被访问,因此在算法实现时,需要使用一个队列。在遍历进行之前先把二叉树的根结点的存储地址入队,然后依次从队列中出队结点的存储地址,每出队一个结点的存储地址则对该结点进行访问,然后依次将该结点的左孩子和右孩子的存储地址入队,如此反复,直到队空为止。
具体算法如下:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

#define maxsize 20

typedef int datatype;
typedef struct node
{
	datatype data;
	struct node *lchild,*rchild;
}bitree;

void Layer(bitree *p);
bitree* CreatBitree(int* arrayA,int n);
int countleaf(bitree *p);
int treedepth(bitree*p,int l);

void main()
{
	int arrayA[10]={0,1,2,3,4,5,6,7,8,9};//第一个节点没有用于存储数据
	int n=sizeof(arrayA)/sizeof(int);
    int l=0;//二叉树的深度
	bitree *head=NULL;

	head=CreatBitree(arrayA,n);

	
	printf("按广度优先搜索遍历的结果为:");
	Layer(head);
	printf("\n");

}

/**************************************************\
函数功能:二叉树的广度优先遍历
输入:二叉树的根节点
输出:无
\**************************************************/
void Layer(bitree *p)
{
	bitree* queue[maxsize];//queue数组用于存储节点地址
	bitree* s;
	int rear=0;  //队列尾指针
	int front=0; //队列头指针

	if(p!=NULL)//输入的树不为空
	{
		rear=1; //初始化
		front=0;
		queue[rear]=p;
		while(front<rear)//判断队列是否为空
		{
			front++;
			s=queue[front];
			printf("%d ",s->data);
			if(s->lchild!=NULL) //存储左右子节点
			{
				rear++;
				queue[rear]=s->lchild;
			}
			if(s->rchild!=NULL)
			{
				rear++;
				queue[rear]=s->rchild;
			}
		}
	}
}

/*************************************************\
函数功能:建立二叉树(按照顺序方式)
输入:    原始数组
输出:    二叉树的头结点
\*************************************************/
bitree* CreatBitree(int* arrayA,int n)//顺序存储 建立二叉树
{
	bitree *root;
	bitree *queue[maxsize];
	bitree *p;
	int front,rear;
	front=1;rear=0;
	root=NULL;

	for(int i=1;i<n;i++)
	{
		p=(bitree*)malloc(sizeof(bitree));
		p->data=arrayA[i];
		p->lchild=NULL;
		p->rchild=NULL;

		rear++;
		queue[rear]=p;

		if(rear==1)
			root=p;
		else
		{
			if(i%2==0)
				queue[front]->lchild=p;
			else
			{
				queue[front]->rchild=p;
				front=front+1;
			}
		}

	}

	return root;
}
注:如果程序出错,可能是使用的开发平台版本不同,请点击如下链接: 解释说明


目录
相关文章
|
1月前
|
存储 算法
【数据结构与算法】二叉树基础OJ--下(巩固提高)
【数据结构与算法】二叉树基础OJ--下(巩固提高)
|
1月前
|
算法 Java
算法:Java计算二叉树从根节点到叶子结点的最大路径和
算法:Java计算二叉树从根节点到叶子结点的最大路径和
|
15天前
|
算法
【算法与数据结构】二叉树(前中后)序遍历2
【算法与数据结构】二叉树(前中后)序遍历
|
1天前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
|
12天前
|
算法 索引
【算法与数据结构】深入二叉树实现超详解(全源码优化)
【算法与数据结构】深入二叉树实现超详解(全源码优化)
|
12天前
|
存储 算法
【算法与数据结构】深入解析二叉树(二)之堆结构实现
【算法与数据结构】深入解析二叉树(二)之堆结构实现
|
1月前
|
存储 算法
【数据结构与算法】二叉树基础OJ -- 上 (巩固提高)-2
【数据结构与算法】二叉树基础OJ -- 上 (巩固提高)-2
|
1月前
|
算法
【数据结构与算法】二叉树基础OJ -- 上 (巩固提高)-1
【数据结构与算法】二叉树基础OJ -- 上 (巩固提高)-1
|
2月前
|
监控 算法 测试技术
【动态规划】【树形dp】【C++算法】968监控二叉树
【动态规划】【树形dp】【C++算法】968监控二叉树
|
2月前
|
算法 C++
二叉树算法题(一)
二叉树算法题(一)