题目地址:力扣
题目难度:Medium
涉及知识点:二叉树层序遍历、双端队列
分析:实现锯齿形遍历,首先发现这道题要求是层序遍历,和层序遍历不相同的地方就在于它每隔一行就会由“从右向左”变为“从左向右”,依次在这两个状态之间转换。那么很容易想到的就是使用标志位来判断到底应该是哪个状态,同时由于从右向左和从左向右对节点顺序有要求,那么使用双端队列或者双栈就成了很容易想到的解法。
解法1:双端队列实现
思路:和分析一致
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
// 双端队列以及标志位,标志位为true表示应该头进尾出,false为尾进头出
deque<TreeNode*> node_q;
bool order = true;
// 保存最终结果
vector<vector<int>> res;
// 只要树不空
if (root != nullptr) {
// 先将头结点加入队列
node_q.push_back(root);
// 只要队列不空
while (!node_q.empty())
{
// 获取当前队列长度,创建当前层结果数组
int sz = node_q.size();
vector<int> cur_res;
// 遍历队列中的所有节点
while (sz != 0)
{
// 尾进头出,扫描孩子节点是从右向左
if (!order) {
TreeNode* tmp = node_q.front();
cur_res.push_back(tmp->val);
node_q.pop_front();
if (tmp->right != nullptr)
node_q.push_back(tmp->right);
if (tmp->left != nullptr)
node_q.push_back(tmp->left);
// 头进尾出,扫描孩子节点是从左向右
} else {
TreeNode* tmp = node_q.back();
cur_res.push_back(tmp->val);
node_q.pop_back();
if (tmp->left != nullptr)
node_q.push_front(tmp->left);
if (tmp->right != nullptr)
node_q.push_front(tmp->right);
}
// 计数器自减
--sz;
}
// 当前层扫描完毕,下一层顺序变化
order = !order;
// 将当前层结果加入最终结果
res.push_back(cur_res);
}
}
return res;
}
};
Accepted
- 33/33 cases passed (4 ms)
- Your runtime beats 58.61 % of cpp submissions
- Your memory usage beats 47.87 % of cpp submissions (11.8 MB)