[LeetCode] Binary Tree Zigzag Level Order Traversal
To be honest, I do not know whether this problem is designed to let you use stacks. Anyway, I don't. Here are my codes, both BFS and DFS version.
1 // BFS 2 vector<vector<int>> zigzagLevelOrder(TreeNode* root) { 3 vector<vector<int> > levels; 4 if (!root) return levels; 5 queue<TreeNode*> toVisit; 6 toVisit.push(root); 7 int curLevelNodes = 1; 8 bool flag = false; 9 while (!toVisit.empty()) { 10 vector<int> level; 11 for (int i = 0; i < curLevelNodes; i++) { 12 TreeNode* node = toVisit.front(); 13 toVisit.pop(); 14 level.push_back(node -> val); 15 if (node -> left) toVisit.push(node -> left); 16 if (node -> right) toVisit.push(node -> right); 17 } 18 if (flag) { 19 reverse(level.begin(), level.end()); 20 flag = false; 21 } 22 else flag = true; 23 levels.push_back(level); 24 curLevelNodes = toVisit.size(); 25 } 26 return levels; 27 } 28 29 // DFS 30 void dfs(TreeNode* node, int curLevel, bool& nextLevel, vector<int>& level) { 31 if (!node) return; 32 if (curLevel == 1) { 33 level.push_back(node -> val); 34 if (node -> left || node -> right) nextLevel = true; 35 } 36 else { 37 dfs(node -> left, curLevel - 1, nextLevel, level); 38 dfs(node -> right, curLevel - 1, nextLevel, level); 39 } 40 } 41 vector<vector<int> > zigzagLevelOrder(TreeNode* root) { 42 vector<vector<int> > levels; 43 if (!root) return levels; 44 int curLevel = 1; 45 bool nextLevel = true, flag = false; 46 while (nextLevel) { 47 nextLevel = false; 48 vector<int> level; 49 dfs(root, curLevel++, nextLevel, level); 50 if (flag) { 51 reverse(level.begin(), level.end()); 52 flag = false; 53 } 54 else flag = true; 55 levels.push_back(level); 56 } 57 return levels; 58 }
Update
Thanks to the remind of ljdsoft1, I have rewritten the code to traverse the nodes in ziazag-order instead of simply reversing it. The code is as follows, using two stacks.
1 class Solution { 2 public: 3 vector<vector<int>> zigzagLevelOrder(TreeNode* root) { 4 vector<vector<int> > levels; 5 if (!root) return levels; 6 stack<TreeNode*> curLevel, nextLevel; 7 curLevel.push(root); 8 bool reversed = false; 9 while (!curLevel.empty()) { 10 vector<int> level; 11 while (!curLevel.empty()) { 12 TreeNode* node = curLevel.top(); 13 curLevel.pop(); 14 level.push_back(node -> val); 15 if (reversed) { 16 if (node -> right) nextLevel.push(node -> right); 17 if (node -> left) nextLevel.push(node -> left); 18 } 19 else { 20 if (node -> left) nextLevel.push(node -> left); 21 if (node -> right) nextLevel.push(node -> right); 22 } 23 } 24 levels.push_back(level); 25 swap(curLevel, nextLevel); 26 reversed = !reversed; 27 } 28 return levels; 29 } 30 };
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1
· 一次Java后端服务间歇性响应慢的问题排查记录