题目
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
思路:1栈1队列,k是每一层的标识数
在奇数层,进行正常的层序遍历进入队列的同时,并入栈 。如:队列[1,2] 栈[2,1]
在偶数层,出栈并入数组,这样可以保证此层是逆向遍历。但还是按照队列的弹出顺序入下一层。
这样在下一奇数层,还是正常顺序入数组。
总结:奇数层按队列弹出顺序,偶数层按栈的弹出顺序!
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root)
{
int k = 1;
vector<vector<int>> vv;
queue<TreeNode*> q1;
stack<TreeNode*> st;
if(root != NULL)
q1.push(root);
while(!q1.empty() )
{
int size = q1.size();
vector<int> v;
if(k % 2 != 0)//判断奇偶层
{
for(size;size>0;size--)
{
TreeNode* cur = q1.front();
q1.pop();
v.push_back(cur->val);
if(cur->left != NULL)
{
q1.push(cur->left);
st.push(cur->left);
}
if(cur->right!= NULL)
{
q1.push(cur->right);
st.push(cur->right);
}
}
}
else
{
int size1 = st.size();
for(size1;size1>0;size1--)
{
TreeNode* prev = st.top();//偶数层入栈中的数据
st.pop();
v.push_back(prev->val);
TreeNode* cur = q1.front();
q1.pop();
if(cur->left != NULL)
q1.push(cur->left);
if(cur->right!= NULL)
q1.push(cur->right);
}
}
vv.push_back(v);
k++;
}
return vv;
}
};