[LeetCode] Binary Tree Zigzag Level Order Traversal
2015-07-04 10:57
381 查看
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.
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.
// BFS vector<vector<int>> zigzagLevelOrder(TreeNode* root) { vector<vector<int> > levels; if (!root) return levels; queue<TreeNode*> toVisit; toVisit.push(root); int curLevelNodes = 1; bool flag = false; while (!toVisit.empty()) { vector<int> level; for (int i = 0; i < curLevelNodes; i++) { TreeNode* node = toVisit.front(); toVisit.pop(); level.push_back(node -> val); if (node -> left) toVisit.push(node -> left); if (node -> right) toVisit.push(node -> right); } if (flag) { reverse(level.begin(), level.end()); flag = false; } else flag = true; levels.push_back(level); curLevelNodes = toVisit.size(); } return levels; } // DFS void dfs(TreeNode* node, int curLevel, bool& nextLevel, vector<int>& level) { if (!node) return; if (curLevel == 1) { level.push_back(node -> val); if (node -> left || node -> right) nextLevel = true; } else { dfs(node -> left, curLevel - 1, nextLevel, level); dfs(node -> right, curLevel - 1, nextLevel, level); } } vector<vector<int> > zigzagLevelOrder(TreeNode* root) { vector<vector<int> > levels; if (!root) return levels; int curLevel = 1; bool nextLevel = true, flag = false; while (nextLevel) { nextLevel = false; vector<int> level; dfs(root, curLevel++, nextLevel, level); if (flag) { reverse(level.begin(), level.end()); flag = false; } else flag = true; levels.push_back(level); } return levels; }
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.
class Solution { public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { vector<vector<int> > levels; if (!root) return levels; stack<TreeNode*> curLevel, nextLevel; curLevel.push(root); bool reversed = false; while (!curLevel.empty()) { vector<int> level; while (!curLevel.empty()) { TreeNode* node = curLevel.top(); curLevel.pop(); level.push_back(node -> val); if (reversed) { if (node -> right) nextLevel.push(node -> right); if (node -> left) nextLevel.push(node -> left); } else { if (node -> left) nextLevel.push(node -> left); if (node -> right) nextLevel.push(node -> right); } } levels.push_back(level); swap(curLevel, nextLevel); reversed = !reversed; } return levels; } };
相关文章推荐
- Unity中HideInInspector和SerializeField
- 4、Django基本数据操作
- 2015070403 - EffactiveJava笔记 - 第56条 遵守普遍命名规范(2)
- sync_binlog
- [转] iOS开发工具-网络封包分析工具Charles
- 各种相似度计算的python实现
- Rust语言
- IOS开发中的CGFloat、CGPoint、CGSize和CGRect
- eclipse如何开启/关闭代码提示功能
- Swift使用单个案件管理FMDB数据库
- unity如何调用另一个脚本中的变量
- DNS服务配置
- notify通知遗漏问题
- java基础------存取大文件数据
- HBuilder开发App教程03-定制图标,启动页以及打包
- LeetCode Symmetric Tree
- [LeetCode]Search for a Range
- Fragment的懒加载(解决ViewPager中Fragment生命周期错乱的问题)
- GCO3.0的图割分割算法应用(三)
- 网络图片加载