AcWing 44. 分行从上往下打印二叉树(计数法+标记法)

关于使用EB tresos出现无法激活的情况解决 我在安装eb studio时就是在激活方面有问题导致无法使用,下面讲解出现了什么问题以及我如何去解除的。EB安装完成时需要激活才能使用的,不然都打开或者建立不了工程,一直都是报的dns服务器错误,好的,那我改dns服务器地址。填写dns服务器地址,也可以换成别的,自己百度一下适合自己的。这是解决方案哈哈哈哈。 阅读详情

首先,我们要知道一件事。那就是:在用辅助队列进行二叉树层次遍历时,辅助队列中的所有节点在层次上要么均来自同一层,要么来自相邻两层。而且对于后者的情况,辅助队列中从队头到队尾的所有节点,前半部分节点所在层数距离根节点较近,而后半部分则较远。

因此,本题的解题关键就在于如何正确地区分这两部分。可以想到的方法有两种。第一种是设置两个计数器,分别记录辅助队列中不同层中节点的个数并且动态维护。另一种则是在出现分层时及时地向辅助队列中插入特殊的标记用来提醒程序换行打印。这两种方法各有难度,前者是如何进行动态维护,后者则是如何判断插入标记的时机。

另外,由于本题仍然是属于层次遍历的问题。因此以下两个方法的代码均是在层次遍历的模板上修改而来的。

1.计数器法

我们将辅助队列中的节点从前往后分为“当前层”和“下一层”,分别设置两个计数器记录节点数。出队时当前层计数器自减,入队时下一层计数器自增。当当前层计数器变为0时,说明当前层节点已经被完全遍历,需要换行。此时只需将下一层计数器的值赋值给当前计数器,然后再将下一层计数器清零即可。

具体代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> printFromTopToBottom(TreeNode* root) {
        vector<vector<int>> ans;
        if(!root) return ans;
        queue<TreeNode *> q;
        q.push(root);
        int cur_level = 1, next_level = 0; //记录当前层及下一层的节点个数
        vector<int> temp; //存放当前层的打印结果
        while(!q.empty()){
            TreeNode *p = q.front();
            q.pop();
            temp.push_back(p -> val);
            cur_level--;
            if(p -> left){
                q.push(p -> left);
                next_level++;
            }
            if(p -> right){
                q.push(p -> right);
                next_level++;
            }
            if(!cur_level){ //辅助队列中当前层计数器为0说明要换行
                ans.push_back(temp);
                temp.clear();
                cur_level = next_level;
                next_level = 0;
            }
        }
        return ans;
    }
};

2.标记法

我们可以使用空节点NULL来作为标记以分割在辅助队列中的不同层的节点。当队头节点为空时,说明当前层已经遍历完毕,需要换行。此时如果队列非空,则在队尾再插入一个NULL用来作为分割标记。注意:必须要先判断队列是否为空,否则在遍历结束时程序会陷入不断向辅助队列中插入NULL的死循环。

具体代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> printFromTopToBottom(TreeNode* root) {
        vector<vector<int>> ans;
        if(!root) return ans;
        queue<TreeNode *> q;
        q.push(root);
        q.push(NULL); //第一层只有一个节点,故直接插入一个标记
        vector<int> temp;
        while(!q.empty()){
            TreeNode *p = q.front();
            q.pop();
            if(p){
                temp.push_back(p -> val);
                if(p -> left) q.push(p -> left);
                if(p -> right) q.push(p -> right);
            }
            else{ //当前节点是标记说明要换行
                ans.push_back(temp);
                temp.clear();
                if(!q.empty()) q.push(NULL); //这里必须添加if语句,否则的话队列会在最后不停地插入NULL
            }
        }
        return ans;
    }
};

 

光模块MCU开发全解析:从架构原理到固件调试实战 在高速光模块中,MCU并非传统印象里的核心处理器,而是负责数字诊断、闭环控制和协议管理的嵌入式管家。随着800G、1.6T模块的普及,MCU与DSP/SoC的协同、I2C总线通信、ADC采集、APC/TEC控制等低速域任务愈发关键。理解MCU的选型规格、启动流程和固件设计,是保障光模块稳定运行的基础。本文从光模块架构切入,剖析MCU的角色定位,详细拆解I2C从机实现、电芯片配置、校准与升级等工程细节,并结合实际调试经验梳理常见故障与排查思路,为嵌入式工程师提供一份可落地的光模块MCU开发指南。 阅读详情

相关推荐

Workbuddy+DeepSeek V4傻瓜流配置全指南:API接入、模型切换与Agent实战

AI编程助手的核心价值不在于模型本身,而在于如何稳定、安全、低门槛地调用其能力。Agent作为智能体范式,依赖可靠的运行时环境与标准化API通信;DeepSeek V4系列凭借高吞吐、低延迟和强工具调用支持,成为当前生产级Agent的理想引擎。Workbuddy则通过本地配置管理、环境变量注入与UTF-8无BOM容错等工程设计,将复杂部署简化为可复现、可版本化、可团队协同的实践流程。本文聚焦API接入路径下的真实卡点——从Key获取验证、models.json字段语义到沙箱权限控制,覆盖开发者在Window

weixin_33702545的博客 2375

AcWing 34. 链表中环的入口结点(快慢指针赛跑+地址映射)

1.快慢指针赛跑 这是一个做起来很巧妙的算法,而且这个方法既不会改变原链表的结构,又不会需要额外的空间。 具体的操作是:从头结点开始,令快指针每次移动两个单位,慢指针每次移动一个单位。如果链表有环则两个指针必定会在环上的某一个位置相遇。此时令快指针重回起点,然后让两个指针同时每次移动一个单位,当两个指针再次相遇时(必定会相遇),相遇的结点恰好就是环的入口结点。 证明如下: 假设链表...

Zee_Chao的博客 1493

SDFCOM_SWC警告深度剖析:从assign短路到时序标注失效的链路追踪

本文深入剖析了SDFCOM_SWC警告的根源,从assign短路到时序标注失效的全链路追踪。通过分析RTL设计中的assign语句陷阱、综合阶段的优化变形以及PrimeTime生成SDF文件的视角,提出了重构RTL设计、警告抑制和SDF生成优化等解决方案,帮助工程师有效避免时序标注问题。

weixin_42519985的博客 363

AcWing解题目录(C++)

# 试题名称 思想方法 难度 试题来源 1 A+B 简单 AcWing 2 01背包问题 简单 3 完全背包问题 简单 4 多重背包问题I 简单 5 多重背包问题II 中等 6 多重背包问题...

Zee_Chao的博客 900

从零开始:Doherty功率放大器的ADS仿真实践指南

本文详细介绍了Doherty功率放大器在ADS中的仿真设计流程,从基础原理到实际工程应用。通过负载调制技术,Doherty结构显著提高了功率放大器的效率,特别适合处理高峰均比信号。文章包含ADS环境搭建、对称与非对称设计、常见问题调试等实用内容,为射频工程师提供全面的实践指南。

weixin_29313547的博客 690

YOLO11改进-注意力-引入自调制特征聚合模块SMFA

SMFA(自调制特征聚合模块): SMFA模块用于协同建模局部和非局部信息,它分为两个分支:一个是EASA(Efficient Approximation of Self-Attention,简化的自注意力分支),用于捕获非局部信息;另一个是LDE(Local Detail Estimation,局部细节估计分支),用于捕获局部细节。EASA通过对输入特征进行下采样,然后利用全局特征的方差进行调制,再与原始特征进行聚合,提取非局部结构信息。LDE分支则通过卷积操作提取输入特征中的高频局部信息。

qq_64693987的博客 2208

AcWing 21. 斐波那契数列(迭代算法(或DP算法))

斐波那契数列的求法有很多种,这里只列举一种最简单的方法。我们先假设斐波那契数列是如下排列的: 下标 0 1 2 3 4 5 …… 数据 0 1 1 2 3 5 …… 我们先设置两个变量f和g,并分别初始化为0和1以代表第0号元素和第1号元素。然后我们可以很容易地发现,只要不断重复进行如下操作 f ...

Zee_Chao的博客 864

基于STM32L4XX、HAL库的ICM-42607-P姿态传感器驱动程序设计

/ 转换为dps(±1000dps量程)float accel_x = sensor_data.accel_x * (8.0f / 32768.0f);// 转换为g值(±8g量程)#define ICM42607_I2C_ADDR 0x68 << 1 // I2C地址(SA0=0)= 0x40) { // ICM-42607的WHO_AM_I值为0x40。// 读取传感器数据。

zhusl6688的博客 835

AcWing 1.A+B

具体代码如下: #include <iostream> using namespace std; int main() { int a, b; cin >> a >> b; cout << a+b; return 0; }

Zee_Chao的博客 650

ABAP Bits and Bytes 完全参考,理解内存、字节、位运算与类型解释

ABAP开发中业务代码与底层字节处理的差异:业务层关注采购订单、会计凭证等语义信息,而接口开发需处理十六进制、位运算等底层操作。文章通过整数变量示例说明同一段字节在不同类型解释下会呈现不同值,并介绍x类型、位运算及类型转换的实际应用。这些知识在文件接口、加密传输等场景中尤为重要,开发者需注意字节序、编码等问题。建议将底层协议处理与业务逻辑分离,以保持代码清晰和可维护性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 142

【人工智能】在 cc-switch 中配置 AnyRouter 接入 Claude Code 完整指南

本文介绍了在cc-switch工具中配置AnyRouter中转服务以接入Claude Code的详细步骤。主要内容包括:1) 准备API令牌和端点地址;2) 填写基础信息和模型参数;3) 保存配置并重启终端生效;4) 常见问题排查方法。重点强调了API地址格式、模型ID准确性以及配置写入的必要性,帮助用户顺利完成中转服务配置,实现Claude 4.5版本的正常使用。

奶爸的编程之路,也就一周冷个三天 3103

AcWing 23. 矩阵中的路径(DFS)

这是一道比较经典的深度优先搜索问题。首先,记录下每个字符串的起点位置。然后从每个位置开始进行深度优先搜索。 具体代码如下: class Solution { public: int dx[4] = {0, 0, -1, 1}; int dy[4] = {-1, 1, 0, 0}; bool dfs(vector<vector<char>...

Zee_Chao的博客 551

YOLO26涨点改进 | 全网独家复现、小目标检测改进篇 | TGRS 2025 | YOLO26引入MFAE-YOLO中的GFFP、FCPS 和 C3k2-FPEU创新点,涨点起飞,直接发论文

🔥本文给大家介绍在YOLO26中引入MFAE-YOLO中的 GFFP(全局特征融合处理)、FCPS(特征通道像素注意力) 和 C3k2-FPEU(特征池提取单元) 二次创新改进模块,能显著提升对小目标的检测性能。GFFP通过多尺度特征融合增强全局上下文感知能力,有效提升小目标在复杂背景下的可辨性;FCPS融合通道、像素和空间注意力机制,增强了模型对关键细节和小区域特征的关注,提升检测精度;C2F-FPEU利用多种池化方式挖掘细节特征,优化浅层特征表示能力。三者协同提升了YOLO26在小目标检测中的鲁棒性。

Ai缝合怪、助力小伙伴高效发论文 306

AcWing 51. 数字排列(DFS(有重复排列+无重复排列))

OJ上这道题的描述并不清晰。实际上,它的要求是输出所有“不重复的排列方式”。 1.next_permutation()(无重复排列) 要解决数组无重复排列的问题,那么这个方法是再合适不过的了。在使用这个函数前注意要引入<algorithm>头文件并且为了保证可以枚举所有情况要实现对数组进行“由小到大”的排序。 具体代码如下: class Solution { public...

Zee_Chao的博客 515

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

AcWing 14. 不修改数组找出重复的数字(分治法)

如果不将思考题考虑在内的话,那么AcWing 13.找出数组中重复的数字中的方法1的代码是可以完全移植过来的。这里不再赘述。不过,由于这道题的样例里面不存在含有超出范围的数据以及全部数据均出现一次的情况,因此代码还可以进一步简化。 简化后的具体代码如下: class Solution { public: int duplicateInArray(vector<int>...

Zee_Chao的博客 494

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

AcWing 13.找出数组中重复的数字(循环交换)

1.方法1 简单来说就是开辟一个空间为n的向量用来做数字出现次数的统计。由于题目只要求返回任意一个重复的数字,因此只需遍历统计向量找到首个记录出现次数大于1的数字即可。 具体代码如下: class Solution { public: int duplicateInArray(vector<int>& nums) { int n = nums...

Zee_Chao的博客 490

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

AcWing 15. 二维数组中的查找(非递归算法和递归算法)

1.非递归算法 观察此二维数组(以下称为“矩阵”),可以发现该矩阵的副对角线上的每一个元素均满足一个规律,那就是其左侧在同一行的元素均比其小,下侧在同一列的元素均比其大。于是,从副对角线入手进行查找就可以通过一次比较操作排除一整行和一整列的元素。从而大幅缩短时间开销。具体操作就是,当前位置元素如果等于目标元素则直接返回true,小于目标元素则将遍历指针下移一个单位,大于目标元素则将遍历指针左...

Zee_Chao的博客 467

AcWing 49. 二叉搜索树与双向链表(前驱后继+中序遍历)

1.利用前驱后继 对于一个二叉树,可以将其分为左子树、根节点和右子树三部分。根据题目要求可知将BST化为一个排好序的双向链表实际上就是将其中序遍历序列对应的各个节点连接起来。同时还可以知道若根的左右子树非空,则根节点在链表中的前驱结点一定在其左子树中,后继结点一定在其右子树中。那么可以先找到并标记根节点的前驱和后继,然后连接。同时递归执行这一过程便能达到要求。 具体代码如下: /** ...

Zee_Chao的博客 420

AcWing 27. 数值的整数次方

1.方法1 根据题意只需要按常规的循环处理就行了。 具体代码如下: class Solution { public: double Power(double base, int exponent) { int n = abs(exponent); //取绝对值可以简化代码,等输出时再判断是否取倒数返回 double ans = 1.; ...

Zee_Chao的博客 416

AcWing 16. 替换空格

具体代码如下: class Solution { public: string replaceSpaces(string &str) { string ans; for(auto &e: str){ if(e == ' ') ans += "%20"; else ans += e; ...

Zee_Chao的博客 410

AcWing 26. 二进制中1的个数

1.方法1 容易理解的方法就是判断二进制最低位是否为1,然后计数器加一再将数据右移1位,直到数据变成0。需要注意的是,输入数据可能是负数。负数在右移时最高位会持续补1,这样的话程序会进入死循环。因此需要将输入数据强制类型转换为无符号整数,使得其右移时最高位补0(相关知识参考计算机组成原理的内容)。这里由于我们只关心输入数据的二进制表示,所以不必担心强制类型转换会带来问题。 由于每一次右移都...

Zee_Chao的博客 408

AcWing 45. 之字形打印二叉树(双栈法+reverse方法)

1.双栈法 根据经验,我们可以发现这道题需要对层次遍历的模板进行一定的改动。如果我们将根节点所在层定义为第0层,可以发现凡是偶数层都是从左往右打印,而奇数层却恰好相反。考虑到下一层与上一层节点的关系以及他们的相反输出次序,可以试着引入栈来进行反向输出的操作。那么问题来了,要怎么去设计对栈的控制呢? 这里的方案是引入两个栈,一个负责偶数层节点,记作stack0,另一个负责奇数层的,记作sta...

Zee_Chao的博客 402

AcWing 48. 复杂链表的复刻(地址映射+原地复刻)

1.地址映射 考虑将原链表的各个结点从头到尾依次进行编号。这样结点之间的指向关系就可以用编号来代替。在按一般链表的顺序复制好链表以后,就可以用编号的指向关系快速地定位每个新结点的额外指针的指向。这里为了方便对复制的链表进行编号,可以考虑用向量来依次存放每个新结点。至于原链表的结点与编号的关系可以考虑建立一个从结点地址到数字的映射关系。 具体代码如下: /** * Definition...

Zee_Chao的博客 394

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 315

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 591
上一篇: AcWing 43. 不分行从上往下打印二叉树(层次遍历模板)
下一篇: AcWing 45. 之字形打印二叉树(双栈法+reverse方法)
Zee_Chao
博客等级 码龄11年 168粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值