2021-03-03

队列和双端队列在二叉树层序遍历中的应用 简单示例

LeetCode -103题二叉树的锯齿形层序遍历

题目要求:给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

按照层序遍历,使用队列来管理遍历的元素

第一层  3

第二层 9 20

第3层 15 7

但是输出要求是

3

20 9

15 7

从输出要求可以看出

在第二层输出元素与遍历的顺序相反,本来想用一个标记进行处理,执行之后发现只能通过部分用例;

1、观察输出与遍历顺序的差异后,发现可以用双端队列deque进行管理,在遍历第二层的时候,依次遍历 9 20,在deque的头部插入9 20,这样取出来后为20 9

2、在遍历第3层的时候,依次遍历15 7,在deque的尾部插入15 7,取出来后为15 7

3、总结规律:在遍历时,前一次使用双端队列的尾部插入元素,后一次使用双端队列的头部插入元素,再使用双端队列的尾部插入元素,依次遍历二叉树

代码如下:

#include <iostream>
#include <vector>
#include <queue>
#include <deque>
using namespace std;

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root)
    {
        vector<vector<int>> result;
        queue<TreeNode*> q;
        if (root != nullptr) {
            q.emplace(root);
        }
        bool isInOrder = true;
        while (!q.empty()) {
            deque<int> deq;
            int size = q.size();
            for (int i = 0; i < size; i++) {
                TreeNode *node = q.front();
                q.pop();
                if (isInOrder) {
                    // 尾部插入
                    deq.emplace_back(node->val);
                } else {
                    // 头部插入
                    deq.emplace_front(node->val);
                }
                // 该节点二叉树的左节点添加到队列中
                if (node->left) {
                    q.emplace(node->left);
                }
                // 该节点二叉树的右节点添加到队列中
                if (node->right) {
                    q.emplace(node->right);
                }
            }
            vector<int> vec;
            for (auto item : deq) {
                vec.emplace_back(item);
            }
            result.emplace_back(vec);
            // 上一层遍历完成后, 下一层需要改变双端队列的插入部位(头还是尾)
            isInOrder = !isInOrder;
        }
        return result;
    }
};

执行结果:

embedcpp-2021-03是一个有关嵌入式C++编程的课程,于2021年3月举办。嵌入式C++编程是指在嵌入式系统中使用C++编程语言进行开发的一种方法。 在嵌入式系统中,资源通常是有限的,例如处理器速度、内存容量和存储空间等。因此,使用C++编程语言可以提供更高的灵活性和效率,帮助开发人员充分利用有限的资源。C++在嵌入式系统中的应用范围广泛,例如物联网设备、汽车电子和工业自动化等领域。 embedcpp-2021-03课程旨在向学员介绍嵌入式C++编程的基础知识和技巧。课程内容通常包括以下方面: 1. C++语法和特性:介绍C++的基本语法、面向对象编程和泛型编程等概念,以及C++11、C++14和C++17的一些新特性。 2. 嵌入式系统概述:了解嵌入式系统的基本特点、硬件和软件组成,以及与传统桌面开发的区别。 3. 低级编程:学习如何与硬件交互,包括使用寄存器、配置外设和处理中断等。还可以介绍使用汇编语言优化性能的技巧。 4. 内存管理:探讨嵌入式系统中的内存管理技术,包括堆栈和堆的使用、动态内存分配和对象生命周期管理等。 5. 实时操作系统(RTOS):介绍嵌入式系统中常用的实时操作系统,如FreeRTOS和µC/OS等,学习如何使用RTOS进行任务调度和资源管理。 除了理论知识,embedcpp-2021-03课程通常还包括实际的项目练习,以帮助学员将所学知识应用于实际场景。通过该课程,学员可以了解嵌入式C++编程的基础概念和实践技巧,为嵌入式系统开发提供了一定的基础。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值