题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
方法一、层次打印,偶数行反转、
vector<vector<int>> Print(TreeNode* root)
{
queue<TreeNode*> q;
vector<vector<int> > V;
if(root==nullptr)return V;
q.push(root);
int even = 0;
while(!q.empty())
{
vector<int> tmp;//存一行的节点
int n = q.size();
while(n--)
{
root = q.front();
tmp.push_back(root->val);
if(root->left)q.push(root->left);
if(root->right)q.push(root->right);
q.pop();
}
if(even)
reverse(tmp.begin(), tmp.end());
even = !even;
V.push_back(tmp);
}
return V;
}
方法二、用两个栈存储不同层的节点
在打印某一层的节点时,把下一层的节点保存到相应的栈
如果是奇数层,则先保存左节点再保存右节点到第一个栈
如果是偶数层,则先保存右节点再保存左节点到第二个栈
直到俩个栈都为空。
vector<vector<int>> Print(TreeNode* root)
{
vector<vector<int> > V;
if(root==nullptr)return V;
stack<TreeNode*>s1,s2; //奇数层存在栈s1,偶数层存在s2
s1.push(root);
while(!s1.empty()||!s2.empty())
{
if(!s1.empty())
{
vector<int> tmp;
while(!s1.empty())
{
TreeNode *root = s1.top();
s1.pop();
tmp.push_back(root->val);
if(root->left)s2.push(root->left);
if(root->right)s2.push(root->right);
}
V.push_back(tmp);
}
if(!s2.empty())
{
vector<int> tmp;
while(!s2.empty())
{
TreeNode *root = s2.top();
s2.pop();
tmp.push_back(root->val);
if(root->right)s1.push(root->right);//先保存右节点再左节点
if(root->left)s1.push(root->left);
}
V.push_back(tmp);
}
}
return V;
}