leetcode Binary Tree Level Order Traversal
给定一个数,广度优先输出记录。例如:
Given binary tree {3,9,20,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
return its level order traversal as:
[ [3], [9,20], [15,7] ]
思考了一下,居然被我想到了用队列来存储每一层的数据。嘿嘿。
用两个队列,一个队列用来输出,一个队列用来记录下一层的所有左右节点,然后循环使用两个队列即可。
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<vector<int> > levelOrder(TreeNode *root) { vector<vector<int> > ans; if (!root) return ans; vector<int> tmp; TreeNode *lf, *ri, *p; queue<TreeNode *> q1, q2; q1.push(root); while(!q1.empty() || !q2.empty()) { while(!q1.empty()) { p = q1.front(); q1.pop(); tmp.push_back(p -> val); if (p -> left) q2.push(p -> left); if (p -> right) q2.push(p -> right); } ans.push_back(tmp); tmp.clear(); if (q1.empty() && q2.empty()) return ans; // q1完,判断是否都为空 while(!q2.empty()) { p = q2.front(); q2.pop(); tmp.push_back(p -> val); if (p -> left) q1.push(p -> left); if (p -> right) q1.push(p -> right); } ans.push_back(tmp); tmp.clear(); } return ans; } };
一开始使用两个flag标记,来判断是否进入了中间的两个while是否进入,用来判断是否要pushback。后面发现只要在上面注释部分判断是否都为空就行。
当然,我用到了两个队列。可不可以只用一个呢。
用一个队列的话就是用NULL来判断分层。每次完后输入一个NULL。例如:
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<vector<int> > levelOrder(TreeNode *root) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. vector<vector<int> >res; if(root == NULL)return res; queue<TreeNode*> myqueue; myqueue.push(root); myqueue.push(NULL);//NULL是层与层之间间隔标志 vector<int> level; while(myqueue.empty() == false) { TreeNode *p = myqueue.front(); myqueue.pop(); if(p != NULL) { level.push_back(p->val); if(p->left)myqueue.push(p->left); if(p->right)myqueue.push(p->right); } else { res.push_back(level); if(myqueue.empty() == false) { level.clear(); myqueue.push(NULL); } } } return res; } };
分类:
LeetCode
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 全程使用 AI 从 0 到 1 写了个小工具
· 快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿
· AI 插件第二弹,更强更好用
· Blazor Hybrid适配到HarmonyOS系统