题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
/*
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>> result; //结果数组,保存输出元素
if(pRoot==nullptr) //树为空,返回空数组
return result;
stack<TreeNode*> stack1,stack2; //两个栈
stack1.push(pRoot); //第一个栈保存根节点
while(!stack1.empty()||!stack2.empty()) //当两个栈中有一个不空时
{
if(!stack1.empty()) //第一个栈不为不空
{
vector<int> temp; //用来在循环中临时数组保存栈顶元素
while(!stack1.empty()) //第一个栈不为不空,进入循环
{
TreeNode *data=stack1.top(); //保存栈顶元素
stack1.pop(); //删除栈顶元素
temp.push_back(data->val); //保存栈顶元素数据
if(data->left!=nullptr) //栈顶元素左子节点不空入栈
stack2.push(data->left);
if(data->right!=nullptr) //右子节点元素不空入栈
stack2.push(data->right);
}
result.push_back(temp); //把临时数组保存到结果数组中
}
if(!stack2.empty())
{
vector<int> temp; //临时数组
while(!stack2.empty()) ////第二个栈不为不空,进入循环
{
TreeNode *data=stack2.top(); //保存第二个栈的栈顶元素
stack2.pop(); //删除第二个栈的栈顶元素
temp.push_back(data->val); //栈顶元素保存到临时数组
if(data->right) //栈顶元素左子节点不空入栈
stack1.push(data->right);
if(data->left) //栈顶元素右子节点不空入栈
stack1.push(data->left);
}
result.push_back(temp);//把临时数组保存到结果数组中
}
}
return result; //返回结果数组
}
};