数据结构—二叉树广度优先遍历

本文深入讲解了二叉树的广度优先遍历算法,通过实例展示了遍历过程,并探讨了队列在算法中的关键作用。同时,文章对比了广度与深度遍历的不同,强调了数据结构选择的重要性。
该文章已生成可运行项目,

如果说深度遍历是在一个方向上“一头扎到底”,那么广度遍历则恰恰相反,现在各个方向上走出第1步,再在各个方向上走出第2步,第3步…一直在各个方向上全部走完。学习二叉树层序遍历时,第一次发现数据结构还是挺有意思的,选用不同的数据结构,对完成数据操作的难易程度和效率都有很大影响,根据不同业务场景,选择合适的数据结构,至关重要。
在这里插入图片描述

1.二叉树的广度优先遍历

详细遍历步骤如下
1)根节点1进入队列;
2)节点1出队, 输出节点1, 并得到节点1的左子节点2、 右子节点3, 让节点2和节点3入队;
3)节点2出队,输出节点2,并得到节点2的左子节点4、 右子节点
5, 让节点4和节点5入队;
4)节点3出队, 输出节点3, 并得到节点3的右子节点6,让节点6入
队;
5)节点4出队, 输出节点4, 由于节点4没有孩子节点, 所以没有新节点入队;
6)节点5出队, 输出节点5, 由于节点5没有孩子节点, 所以没有新节点入队;
7)节点6出队, 输出节点6, 节点6没有子节点, 没有新节点入队。
至此遍历完毕。
在这里插入图片描述

3.配套代码

配套代码如下,TreeNode 类见上一篇博文https://blog.youkuaiyun.com/mcsdnuser/article/details/106752398

/**
     *二叉树广度遍历
     * @param root
     */
    public void levelOrderTraversal(TreeNode root){
        Queue<TreeNode> quene = new LinkedList<TreeNode>();
        quene.offer(root);
        while (!quene.isEmpty()){
            TreeNode node = quene.poll();
            System.out.println(node.data);
            if(node.left != null){
                quene.offer(node.left);
            }
            if(node.right != null){
                quene.offer(node.right);
            }
        }
    }

4.顺便说一下Queue

队列(Queue)是与栈相对的一种数据结构, 是集合(Collection)的一个子类。队列允许在一端进行插入操作,而在另一端进行删除操作的线性表,栈的特点是后进先出,而队列的特点是先进先出。队列的用处很大,比如实现消息队列。

4.1 Queue 继承结构

在这里插入图片描述
从上图可以看出 Queue 大体可分为以下三类。
双端队列:双端队列(Deque)是 Queue 的子类也是 Queue 的补充类,头部和尾部都支持元素插入和获取。
阻塞队列:阻塞队列指的是在元素操作时(添加或删除),如果没有成功,会阻塞等待执行。例如,当添加元素时,如果队列元素已满,队列会阻塞等待直到有空位时再插入。
非阻塞队列:非阻塞队列和阻塞队列相反,会直接返回操作的结果,而非阻塞等待。双端队列也属于非阻塞队列。

4.2 Queue 方法

Queue 方法如图:
在这里插入图片描述
其中比较常用的方法有以下几个:
add(E):添加元素到队列尾部,成功返回 true,队列超出时抛出异常;
offer(E):添加元素到队列尾部,成功返回 true,队列超出时返回 false;
remove(Object):删除元素,成功返回 true,失败返回 false;
peek():获取但不移除此队列的第一个元素,若队列为空,则返回 null;
poll():获取并移除此队列的第一个元素,若队列为空,则返回 null;
element():获取但不移除此队列的第一个元素,若队列为空,则抛异常。
更为详细我们会在后续展开。。。

本文章已经生成可运行项目
### 广度优先遍历概述 广度优先遍历(Breadth-First Search,BFS)是一种用于遍历或搜索树或图的算法。在二叉树中,广度优先遍历按照层次顺序逐层访问节点,从根节点开始,然后访问其所有子节点,接着是下一层的节点,依此类推。该算法通常使用队列(Queue)数据结构来实现[^1]。 ### C语言实现 在C语言中,可以通过队列结构来实现广度优先遍历。以下是一个完整的示例代码,包括二叉树节点的定义、队列的实现以及广度优先遍历的实现: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构 typedef struct TreeNode { char data; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 定义队列节点结构 typedef struct QueueNode { TreeNode* treeNode; struct QueueNode* next; } QueueNode; // 定义队列结构 typedef struct { QueueNode* front; QueueNode* rear; } Queue; // 初始化队列 Queue* createQueue() { Queue* queue = (Queue*)malloc(sizeof(Queue)); queue->front = queue->rear = NULL; return queue; } // 判断队列是否为空 int isEmpty(Queue* queue) { return queue->front == NULL; } // 向队列中添加元素 void enqueue(Queue* queue, TreeNode* node) { QueueNode* temp = (QueueNode*)malloc(sizeof(QueueNode)); temp->treeNode = node; temp->next = NULL; if (isEmpty(queue)) { queue->front = queue->rear = temp; } else { queue->rear->next = temp; queue->rear = temp; } } // 从队列中移除元素 TreeNode* dequeue(Queue* queue) { if (isEmpty(queue)) { return NULL; } QueueNode* temp = queue->front; TreeNode* node = temp->treeNode; queue->front = queue->front->next; free(temp); return node; } // 广度优先遍历函数 void breadthFirstTraversal(TreeNode* root) { if (root == NULL) { return; } Queue* queue = createQueue(); enqueue(queue, root); while (!isEmpty(queue)) { TreeNode* current = dequeue(queue); printf("%c ", current->data); if (current->left != NULL) { enqueue(queue, current->left); } if (current->right != NULL) { enqueue(queue, current->right); } } free(queue); } // 创建一个新的二叉树节点 TreeNode* createTreeNode(char data) { TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); node->data = data; node->left = node->right = NULL; return node; } // 主函数测试 int main() { // 构建一个简单的二叉树 TreeNode* root = createTreeNode('A'); root->left = createTreeNode('B'); root->right = createTreeNode('C'); root->left->left = createTreeNode('D'); root->left->right = createTreeNode('E'); root->right->left = createTreeNode('F'); printf("广度优先遍历结果:\n"); breadthFirstTraversal(root); // 输出: A B C D E F return 0; } ``` ### 代码解析 1. **二叉树节点定义**: - `TreeNode` 结构体包含一个字符 `data` 和两个指向左右子节点的指针 `left` 和 `right`。 2. **队列定义与操作**: - `Queue` 结构体包含两个指针 `front` 和 `rear`,分别指向队列的前端和后端。 - `enqueue` 函数将二叉树节点加入队列。 - `dequeue` 函数从队列中移除并返回一个二叉树节点。 - `isEmpty` 函数检查队列是否为空。 3. **广度优先遍历函数**: - 首先检查根节点是否为空,如果为空则直接返回。 - 初始化一个队列并将根节点入队。 - 进入循环,直到队列为空为止。每次循环中,取出队列中的节点并打印其数据,然后将其左右子节点依次入队。 - 最后释放队列占用的内存。 4. **测试用例**: - 构建一个简单的二叉树,并调用 `breadthFirstTraversal` 函数进行广度优先遍历。 ### 总结 广度优先遍历是一种非常重要的算法,广泛应用于树和图的遍历问题中。通过使用队列结构,可以高效地实现该算法。上述代码展示了如何在C语言中实现二叉树广度优先遍历
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值