剑指 Offer 32 - II. 从上到下打印二叉树 II
思路#
方法一:辅助队列保存对应层数#
我们可以用广度优先搜索解决这个问题。
我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态,它表示某个节点和它所在的层数,每个新进队列的节点的 level 值都是父亲节点的 level 值加一。
最后根据每个点的 level 对点进行分类,分类的时候我们可以利用哈希表,维护一个以 level 为键,对应节点值组成的数组为值,广度优先搜索结束以后按键 level 从小到大取出所有值,组成答案返回即可。
但是这里已经TreeNode结构已经被LeetCode内部定死了,修改不了,所以可以使用一个额外的队列专门保存层数。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<vector<int>> levelOrder(TreeNode* root) { 13 vector<vector<int>> res; 14 if(root == NULL) 15 return res; 16 17 //使用2个队列 18 //队列A:存储节点 19 //队列B:存储节点所在层数 20 queue<TreeNode *> A; 21 queue<int> B; 22 23 A.push(root); 24 B.push(0); 25 26 vector<int> v; 27 int currentLevel = 0; 28 29 while(!A.empty() && !B.empty()) { 30 TreeNode *t = A.front(); 31 A.pop(); 32 33 int level = B.front(); 34 B.pop(); 35 36 if(level > currentLevel) { 37 currentLevel++; 38 res.push_back(v); 39 v.clear(); 40 } 41 42 v.push_back(t->val); 43 44 if(t->left) { 45 A.push(t->left); 46 B.push(level+1); 47 } 48 49 if(t->right) { 50 A.push(t->right); 51 B.push(level+1); 52 } 53 54 } 55 56 res.push_back(v); 57 58 return res; 59 } 60 };
方法二:当前层循环打印#
当前层循环打印: 循环次数为当前层节点数(即队列 queue 长度);
在添加子节点之前,先保存当前队列的长度qsize,循环出队并打印qsize次就能打印当前层的所有元素。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<vector<int>> levelOrder(TreeNode* root) { 13 vector<vector<int>> res; 14 if(root == NULL) 15 return res; 16 17 queue<TreeNode *> Q; 18 Q.push(root); 19 20 while(!Q.empty()) { 21 vector<int> v; 22 int qsize = Q.size(); 23 24 for(int i = 0; i < qsize; ++i) { 25 TreeNode *t = Q.front(); 26 Q.pop(); 27 v.push_back(t->val); 28 29 if(t->left) 30 Q.push(t->left); 31 if(t->right) 32 Q.push(t->right); 33 } 34 35 res.push_back(v); 36 } 37 38 return res; 39 } 40 };
复杂度分析#
分类:
剑指Offer(第2版)
标签:
二叉树
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2019-11-01 Devc++读取不了当前目录下的文件的解决方法