1.使用一个队列存储当前层的结点,弹出一个结点时向数组写入该节点的值,并使用另一个队列存储当前结点的子结点,在下一次迭代时使用。
2.每一层元素的出现顺序是相反的,父节点在一层里较先弹出,其子结点在一层里则较后弹出,因此先进入队列的结点后弹出。
3.一个结点的左右子结点进入队列的顺序应与父节点所在层的弹出顺序一致,当父节点所在层由左向右弹出时,左子结点应先进入队列,右子结点后进入队列,反之亦然。
vector<vector<int>> zigzagLevelOrder(TreeNode* root)
{
if (root == nullptr)
{
return {};
}
vector<vector<int>>result;
deque<TreeNode*>list;
stack<TreeNode*>next_list;
list.push_back(root);
bool is_from_left = true;
while (list.size() != 0)
{
vector<int>temp;
while (list.size() != 0)
{
TreeNode *x = list.front();
temp.push_back(x->val);
if (is_from_left)
{
if (x->left != nullptr)
{
next_list.push(x->left);
}
if (x->right != nullptr)
{
next_list.push(x->right);
}
}
else
{
if (x->right != nullptr)
{
next_list.push(x->right);
}
if (x->left != nullptr)
{
next_list.push(x->left);
}
}
list.pop_front();
}
while (next_list.size() != 0)
{
list.push_back(next_list.top());
next_list.pop();
}
result.push_back(temp);
is_from_left = !is_from_left;
}
return result;
}