https://oj.leetcode.com/problems/binary-tree-zigzag-level-order-traversal/
1、题目要求:给定一个二叉树,返回Z字形层序遍历二叉树的结果。
例:给定二叉树{3, 9, 20, #, #, 15, 7}
3 / \ 9 20 / \ 15 7其Z字形层序遍历结果为:
[
[3]
[20, 9]
[15, 7]
]
2、解题思路:层序遍历用队列来实现,先进队的结点,其左右子结点也先访问;每次访问队首结点,然后将队首结点的左右子结点入队;
本题要求Z字形层序遍历,关键是
1)将每一层的结点分开——用两个队列que来交换存储每层的结点;
2)将偶数层逆序排列——用栈stk来实现逆序;
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
vector<vector<int> > result;
vector<int> vec;
queue<TreeNode *> que1, que2;
stack<TreeNode *> stk1;
//注意,首先要判断二叉树是否为空,否则会出现runtime error
if (!root)
return result;
//用根结点来初始化que1;
que1.push(root);
while (!que1.empty() || !que2.empty())
{
//如果que1队首结点的左右结点不为空,则将其入队que2
//访问que1队首结点,并出队,
//如此循环,直到que1为空,表示这一层的结点都访问完了,
while (!que1.empty())
{
if (que1.front()->left)
que2.push(que1.front()->left);
if (que1.front()->right)
que2.push(que1.front()->right);
vec.push_back(que1.front()->val);
que1.pop();
}
if (!vec.empty()) result.push_back(vec); //注意,要先判断vec是否为空,否则最后的结果会多加一个空的数组[]
vec.clear();
//将que2队首结点入栈,以便实现逆序输出
//如果que2队首结点的左右结点不为空,则将其入队que1
while (!que2.empty())
{
stk1.push(que2.front());
if (que2.front()->left)
que1.push(que2.front()->left);
if (que2.front()->right)
que1.push(que2.front()->right);
que2.pop();
}
//将que2中结点逆序输出
while (!stk1.empty())
{
vec.push_back(stk1.top()->val);
stk1.pop();
}
if (!vec.empty()) result.push_back(vec); //注意,要先判断vec是否为空,否则最后的结果会多加一个空的数组[]
vec.clear();
}
return result;
}
};