题目
Given a binary tree, return the zigzag level order traversal of its nodes’ values. (ie, from left to right, then right to left for the next level and alternate between).
题目大意就是:给定一颗二叉树,第一层从左向右遍历,第二层从右向左遍历,以此类推,求出最后结果。
分析
每一层的所有节点我们可以用一个栈来存储,对于但每一层的子节点的入栈顺序不一样,比如在第一层(根节点),对于它的子节点,左子节点先入栈,右子节点后入栈,这样,在处理第二层节点时,我们就可以先处理又子节点,这样就完成了第二层从右向左遍历,而对于第二层节点的子节点,右子节点先入栈,左子节点后入栈,这样在处理第三层节点的时候就能做到从左向右遍历
代码
class Solution {
private:
int layer = 0;
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int> > result;
if(root == NULL) {
return result;
}
stack<TreeNode*> ts;
stack<stack<TreeNode* > > ss;
ts.push(root);
ss.push(ts);
while(!ss.empty()) {
++layer;
stack<TreeNode*> s = ss.top();
ss.pop();
stack<TreeNode*> temp; // 用一个新的栈来保存该层节点的所有子节点
vector<int> v;
while(!s.empty()) {
TreeNode* t = s.top();
s.pop();
// 如果是奇数层(从1开始记),则左子节点先入栈
if(layer % 2 != 0) {
if(t -> left != NULL) {
temp.push(t->left);
}
if(t -> right != NULL) {
temp.push(t->right);
}
}
// 如果是偶数层,右子节点先入栈
else {
if(t -> right != NULL) {
temp.push(t->right);
}
if(t -> left != NULL) {
temp.push(t->left);
}
}
v.push_back(t->val);
}
if(temp.size() > 0) {
ss.push(temp);
}
result.push_back(v);
}
return result;
}
};