请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
//主要思路:结合栈是先进先出的特点,利用两个栈分别保存奇数层的结点和偶数层的结点。
//奇数栈和偶数栈的主要区别是奇数栈先存左子树,偶数栈先存右孩子
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > ret;
if(pRoot == nullptr)
{
return ret;
}
stack<TreeNode*> odd;
stack<TreeNode*> even;
TreeNode* curr = nullptr;
odd.push(pRoot);
while(!odd.empty() || !even.empty())
{
vector<int> tmp, tmp1;
while(!odd.empty()) //判断奇数行是否存有结点
{
curr = odd.top();
if(curr->left)
{
even.push(curr->left);
}
if(curr->right)
{
even.push(curr->right);
}
tmp.push_back(curr->val);
odd.pop();
}
if(tmp.size())
{
ret.push_back(tmp);
}
while(!even.empty()) //判断偶数行是否存有结点
{
curr = even.top();
if(curr->right)
{
odd.push(curr->right);
}
if(curr->left)
{
odd.push(curr->left);
}
tmp1.push_back(curr->val);
even.pop();
}
if(tmp1.size())
{
ret.push_back(tmp1);
}
}
return ret;
}
};