本文最后更新于:2022年8月1日 晚上
实战案例:
- 先是二叉树层序遍历,然后改成锯齿形遍历,除此之外,题目还要求符合一定的打印格式。一开始我是用的一个vector作为中间变量储存,然后面试官要求不用vector写一个优化的方法。然后我就考虑用双向队列。
- 阿里变体,n叉树,3层为周期反转
- BFS加一个标记sign,sign为false表示从左到右,元素append到最后,true表示从右到左,元素append到最前面。每遍历一层转换下sign(sign = !sign)
- 使用两个栈,利用栈的FILO特性实现反转
- 阿里面的时候考过这个题,我用了两个栈搞的哈哈哈,但是其实用个flag和一个count控制反转入栈的方向即可
- 双栈或者双端队列
- 微软算法题
- 记得用dfs实现一遍
BFS
2点需要注意:
1、使用deque双端队列;
2、使用isLeft2Right来表示从左向右,还是从右向左,最后变更方向。
代码中注释为重要的,即为于常规的层序遍历不同的地方,因为本题每一层保存的数组顺序是不同的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| class Solution { public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { vector<vector<int>> res; queue<TreeNode*> q; if (root) q.push(root);
bool isLeft2Right = true; while (!q.empty()) { int qsize = q.size(); deque<int> levelList;
for (int i = 0; i < qsize; i++) { auto node = q.front(); q.pop();
if (isLeft2Right) levelList.push_back(node->val); else levelList.push_front(node->val);
if (node->left) q.push(node->left); if (node->right) q.push(node->right); } vector<int> tmp(levelList.begin(), levelList.end()); res.push_back(tmp); isLeft2Right = !isLeft2Right; } return res; } };
|
DFS
1、终止条件
2、层数level的判断条件
3、 如何保存val,根据level的奇偶判断
4、递归左右孩子节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| class Solution { public: vector<vector<int>> res; void dfs(TreeNode* root, int level) { if (root == NULL) return;
if (level >= res.size()) res.push_back(vector<int>());
if (level % 2 == 0) res[level].push_back(root->val); else res[level].insert(res[level].begin(), root->val);
dfs(root->left, level+1); dfs(root->right, level+1); }
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
dfs(root, 0); return res; } };
|