`
weihe6666
  • 浏览: 437167 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

二叉树的广度遍历

 
阅读更多
二叉树的广度遍历


二叉树的广度遍历思想比较简单,即借助于队列对节点进行入队列和出队列,当节点出队列时对左右子节点进行判断,若存在左右子节点,则左右子节点入队列。

具体代码如下:
//建立二叉树,根据左小右大原则,不用递归,用循环
#include <iostream>
#include <assert.h>
using namespace std;

#define MAX   15
//定义结构体
typedef struct tree{
	struct tree *left,*right;
	int data;
}treenode,*b_tree;

typedef struct Qnode
{   treenode *m_treenode;
	struct Qnode *next;
}QNode,*p_QNode;                      /*链队列的结点定义*/ 


typedef struct
{
	p_QNode front ;             /*头指针*/
	p_QNode rear ;              /*尾指针*/
}LiQueue;

b_tree Insert_Tree(b_tree root,int Data)
{
	//声明新节点
	b_tree New;
	b_tree currentnode;

	//初始化新节点
	New = (b_tree)malloc(sizeof(treenode));
	New->data = Data;
	New->left = NULL;
	New->right = NULL;

	if(root == NULL)
		root = New;
	else
	{
		currentnode = root;
		//判断Data位于左子树还是右子树
		while (currentnode != NULL)
		{
			if(Data <= currentnode->data) //左子树
			{
				//判断是否有子树
				if(currentnode->left != NULL)
					currentnode = currentnode->left;
				else
					break;
			}
			else //右子树
				if(currentnode->right != NULL)
					currentnode = currentnode->right;
				else
					break;
		}

		if(Data <= currentnode->data)
			currentnode->left = New;
		else 
			currentnode->right = New;
	}
	return root;
}
//创建二叉树
b_tree Create_Tree(int *array,int len)
{
	assert(array != NULL);
	b_tree root = NULL;
	int i = 0;
	for(; i <len; i++)
		root = Insert_Tree(root,array[i]);
	return root;
}

void print_tree(b_tree root)
{
	if(root == NULL)
		return ;
	else
	{
		printf("%d  ",root->data);
		print_tree(root->left);
		print_tree(root->right);
	}
}

int Depth(b_tree T)
{
	int dep1,dep2;
	int temp;
	if(T==NULL) return(0);
	else
	{
		dep1=Depth(T->left);
		dep2=Depth(T->right);
		temp = max(dep1,dep2);
		return temp+1;
	}
}


void InitQueue(LiQueue &Q)
{
	//构造一个空的Q队列
	Q.front = Q.rear = (p_QNode)malloc(sizeof(Qnode));
	if(!Q.front)
		exit(1);//判断存储是否失败
	Q.front->next = NULL;
}
//入队列操作
void addqueue(LiQueue &Q,b_tree value)
{
	p_QNode new_node;

	new_node = (p_QNode)malloc(sizeof(QNode));
	if(!new_node)
		exit(1);
	new_node->m_treenode = value;
	new_node->next = NULL;

	Q.rear->next = new_node;
	Q.rear = Q.rear->next;
}

//出队列操作
int popqueue(LiQueue &Q)
{
	int temp;
	p_QNode top;
	if(Q.front != NULL)
	{
		temp = Q.front->next->m_treenode->data;
		top = Q.front;
		Q.front = Q.front->next;
		free(top);
	}
	return temp;
}
//广度遍历二叉树 
void layer(b_tree p)
{
	LiQueue root ;
	int temp;

    InitQueue(root);
	addqueue(root,p);
	while(root.front != root.rear)
	{
      //出队列
		temp = popqueue(root);
		printf("%d  ",temp);

		if(root.front->m_treenode->left != NULL)
			addqueue(root,root.front->m_treenode->left);
		if(root.front->m_treenode->right != NULL)
			addqueue(root,root.front->m_treenode->right);
	}
	return;	
}//layer

int main(void)
{
	b_tree root = NULL;
	int hight =0;
	int list[MAX]={0,2,5,9,8,4,7,12,24,3,45,56,21,1,32};
	root = Create_Tree(list,MAX);
	hight = Depth(root);
	printf("hight = %d\n",hight);
	print_tree(root);
	printf("\n广度输出:\n");
	layer(root);
	return 0;
}


输出为:
hight = 8
0  2  1  5  4  3  9  8  7  12  24  21  45  32  56
广度输出:
0  2  1  5  4  9  3  8  12  7  24  21  45  32  56
分享到:
评论

相关推荐

    二叉树广度和深度优先遍历

    二叉树广度和深度优先遍历,通过递归算法实现二叉树的建立,利用递归算法实现深度优先遍历,使用队列实现广度优先遍历

    二叉树深度遍历广度遍历

    总之,掌握二叉树的深度遍历和广度遍历是理解和应用数据结构的关键。通过学习这些基本操作,可以更好地解决实际问题,例如在搜索、排序、图论等领域。在实际编程中,理解并灵活运用这些方法,能够提高代码的效率和...

    二叉树的遍历算法与相关设计

    此外,二叉树的遍历还可以扩展到层次遍历,也称为广度优先搜索(BFS),通过队列实现。层次遍历按从上至下、从左至右的顺序访问所有节点,这对于查找最近公共祖先、构建最小生成树等问题非常有用。 总之,二叉树的...

    二叉树的遍历_二叉树的遍历_

    1. 层次遍历(广度优先搜索) 层次遍历按照从根节点开始,逐层访问所有节点。首先访问根节点,然后访问第一层的所有节点,接着访问第二层的所有节点,以此类推。实现时通常使用队列来存储待访问的节点,新节点入队,...

    【C/C++项目开发资源】二叉树层次遍历-二叉树层次遍历

    二叉树的层次遍历(也称为广度优先遍历)是一种遍历二叉树的方法,它按照从根节点开始从上到下、从左到右的顺序访问每个节点。这种遍历方法可以使用队列(Queue)来实现,因为队列是先进先出(FIFO)的数据结构,...

    二叉树的遍历.ppt

    二叉树的遍历分为两种主要方法:深度优先遍历和广度优先遍历。 1. 深度优先遍历(Depth-First Search, DFS): - 前序遍历(Preorder Traversal):首先访问根节点,然后递归地遍历左子树,最后遍历右子树。记作...

    二叉树的遍历的算法:递归与非递归

    - **层次遍历**(BFS,广度优先搜索):使用队列来存储每一层的节点,从根节点开始,逐层访问所有节点。首先将根节点入队,然后不断取出队首节点访问并将其子节点入队,直到队列为空。 - **Morris遍历**:这是一种...

    二叉树遍历算法应用各种算法包括遍历创建求深度等

    * 二叉树的广度优先搜索:层次遍历可以用来实现二叉树的广度优先搜索算法。 二叉树的高度 二叉树的高度是指从根节点到叶节点的最长路径长度。求二叉树的高度可以使用前序遍历算法,递归地计算每个节点的高度,并将...

    js代码-二叉树广度优先遍历

    综上所述,JavaScript中的二叉树广度优先遍历是通过队列实现的,它按照层次顺序访问树的所有节点。理解并熟练掌握这一算法,对于处理与二叉树相关的问题至关重要。在实际开发中,我们可以根据需求扩展这个基本实现,...

    树/二叉树 各种遍历源代码(C++)

    - **层序遍历**(也称为广度优先搜索):从根节点开始,逐层遍历所有节点。这通常用队列来实现,每次从队列头部取出一个节点,然后将其子节点按顺序入队。 2. **二叉树的遍历**: - **前序遍历**:与树的前序遍历...

    二叉树遍历广度优先

    二叉树遍历是计算机科学中处理树形结构数据时常用的一种操作,它分为深度优先搜索(DFS)和广度优先搜索(BFS)两种方式。本篇文章将重点关注广度优先搜索,即“二叉树遍历广度优先”。 广度优先搜索(BFS)是一种...

    二叉树的遍历.docx

    层序遍历也被称为广度优先遍历,它是按照树的层级从上到下、从左到右依次访问节点的方式。这种方式通常采用队列数据结构来实现。 **非递归实现(使用队列)**: ```python from collections import deque def ...

    二叉树递归遍历,非递归遍历,按层次遍历

    3. **层次遍历**:也称为广度优先遍历,使用队列辅助。首先将根节点放入队列,然后每次取出队首元素访问,并将其左右子节点(如果有)按顺序入队,直到队列为空。层次遍历常用于找到树的最近公共祖先或解决最短路径...

    js代码-(算法)(二叉树)广度遍历

    二叉树有几种遍历方式:深度优先搜索(DFS)包括前序遍历、中序遍历和后序遍历,以及我们关注的广度优先搜索。 广度优先搜索是一种层次遍历策略,从根节点开始,逐层遍历所有节点。首先访问根节点,然后访问所有第...

    二叉树遍历和图遍历演示系统

    二叉树遍历和图遍历是数据结构与算法领域中的重要概念,广泛应用于软件开发、计算机科学教学以及各种计算问题的求解。本系统旨在通过动态演示来帮助理解和掌握这两种遍历方法,并且提供了完整的C语言算法描述,以...

    二叉树的遍历及线索化

    1. **层次遍历(Level Order Traversal)**,也称为广度优先搜索(BFS)。使用队列存储当前层的所有节点,逐个访问并将其子节点入队。这种方法常用于展示树的层级结构。 2. **迭代的深度优先搜索(DFS)**,通常...

    二叉树的遍历代码实现.rar

    在实际编程中,二叉树的遍历也可以用非递归的方式实现,如使用队列进行广度优先搜索(BFS)可以完成前序遍历,而使用栈进行深度优先搜索(DFS)则可以完成中序和后序遍历。这种方式对内存消耗更友好,但代码实现相对...

    bin_tree.rar_二叉树的遍历

    除了这三种基本的遍历方式,还有层序遍历(Level Order Traversal),也被称为广度优先搜索(BFS)。层序遍历按照从上至下、从左到右的顺序访问每一层的节点,通常使用队列来实现。 二叉树遍历的实现可以使用递归或...

Global site tag (gtag.js) - Google Analytics