二叉树的广度遍历
二叉树的广度遍历思想比较简单,即借助于队列对节点进行入队列和出队列,当节点出队列时对左右子节点进行判断,若存在左右子节点,则左右子节点入队列。
具体代码如下:
//建立二叉树,根据左小右大原则,不用递归,用循环
#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),通过队列实现。层次遍历按从上至下、从左至右的顺序访问所有节点,这对于查找最近公共祖先、构建最小生成树等问题非常有用。 总之,二叉树的...
二叉树的层次遍历(也称为广度优先遍历)是一种遍历二叉树的方法,它按照从根节点开始从上到下、从左到右的顺序访问每个节点。这种遍历方法可以使用队列(Queue)来实现,因为队列是先进先出(FIFO)的数据结构,...
二叉树的遍历分为两种主要方法:深度优先遍历和广度优先遍历。 1. 深度优先遍历(Depth-First Search, DFS): - 前序遍历(Preorder Traversal):首先访问根节点,然后递归地遍历左子树,最后遍历右子树。记作...
- **层次遍历**(BFS,广度优先搜索):使用队列来存储每一层的节点,从根节点开始,逐层访问所有节点。首先将根节点入队,然后不断取出队首节点访问并将其子节点入队,直到队列为空。 - **Morris遍历**:这是一种...
* 二叉树的广度优先搜索:层次遍历可以用来实现二叉树的广度优先搜索算法。 二叉树的高度 二叉树的高度是指从根节点到叶节点的最长路径长度。求二叉树的高度可以使用前序遍历算法,递归地计算每个节点的高度,并将...
综上所述,JavaScript中的二叉树广度优先遍历是通过队列实现的,它按照层次顺序访问树的所有节点。理解并熟练掌握这一算法,对于处理与二叉树相关的问题至关重要。在实际开发中,我们可以根据需求扩展这个基本实现,...
- **层序遍历**(也称为广度优先搜索):从根节点开始,逐层遍历所有节点。这通常用队列来实现,每次从队列头部取出一个节点,然后将其子节点按顺序入队。 2. **二叉树的遍历**: - **前序遍历**:与树的前序遍历...
二叉树遍历是计算机科学中处理树形结构数据时常用的一种操作,它分为深度优先搜索(DFS)和广度优先搜索(BFS)两种方式。本篇文章将重点关注广度优先搜索,即“二叉树遍历广度优先”。 广度优先搜索(BFS)是一种...
根据给定的文件信息,我们将深入探讨二叉树遍历的几种主要方式:广度优先遍历(BFS)和深度优先遍历(DFS),其中包括前序遍历、中序遍历和后序遍历。 ### 广度优先遍历(BFS) 广度优先遍历是一种按层次顺序访问...
1. 层次遍历(广度优先搜索) 层次遍历按照从根节点开始,逐层访问所有节点。首先访问根节点,然后访问第一层的所有节点,接着访问第二层的所有节点,以此类推。实现时通常使用队列来存储待访问的节点,新节点入队,...
层序遍历也被称为广度优先遍历,它是按照树的层级从上到下、从左到右依次访问节点的方式。这种方式通常采用队列数据结构来实现。 **非递归实现(使用队列)**: ```python from collections import deque def ...
3. **层次遍历**:也称为广度优先遍历,使用队列辅助。首先将根节点放入队列,然后每次取出队首元素访问,并将其左右子节点(如果有)按顺序入队,直到队列为空。层次遍历常用于找到树的最近公共祖先或解决最短路径...
二叉树有几种遍历方式:深度优先搜索(DFS)包括前序遍历、中序遍历和后序遍历,以及我们关注的广度优先搜索。 广度优先搜索是一种层次遍历策略,从根节点开始,逐层遍历所有节点。首先访问根节点,然后访问所有第...
二叉树遍历和图遍历是数据结构与算法领域中的重要概念,广泛应用于软件开发、计算机科学教学以及各种计算问题的求解。本系统旨在通过动态演示来帮助理解和掌握这两种遍历方法,并且提供了完整的C语言算法描述,以...
1. **层次遍历(Level Order Traversal)**,也称为广度优先搜索(BFS)。使用队列存储当前层的所有节点,逐个访问并将其子节点入队。这种方法常用于展示树的层级结构。 2. **迭代的深度优先搜索(DFS)**,通常...
在实际编程中,二叉树的遍历也可以用非递归的方式实现,如使用队列进行广度优先搜索(BFS)可以完成前序遍历,而使用栈进行深度优先搜索(DFS)则可以完成中序和后序遍历。这种方式对内存消耗更友好,但代码实现相对...
除了这三种基本的遍历方式,还有层序遍历(Level Order Traversal),也被称为广度优先搜索(BFS)。层序遍历按照从上至下、从左到右的顺序访问每一层的节点,通常使用队列来实现。 二叉树遍历的实现可以使用递归或...