题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
按之字形打印二叉树:
也就是说根节点打印之后,第二行从右向左打印,第三行从左向右打印
以此类推
如图: 因此我们利用两个栈进行处理
第二层从右向左打印 就相当于 第一层的子树以先左后右入栈时的出栈顺序
第三层从左向右打印 就相当于 第二层的子树以先右后左入栈时的出栈顺序
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;
//根节点不为空,首先将根节点压入奇数栈
//循环条件:奇数栈或者偶数栈不为空,说明仍有数据
stack<TreeNode*> jishu, oushu;
if (pRoot != nullptr)
{
jishu.push(pRoot);
}
TreeNode* cur = nullptr;
while (!jishu.empty() || !oushu.empty())
{
vector<int> data;
if (!jishu.empty())
{
while (!jishu.empty())
{
//将偶数行的节点存入偶数栈中,但仍注意保存奇数栈
cur = jishu.top();
//要保存奇数行的数据
data.push_back(jishu.top()->val);
jishu.pop();
if (cur->left != nullptr)
oushu.push(cur->left);
if (cur->right != nullptr)
oushu.push(cur->right);
}
result.push_back(data);
}
//将奇数行的数据存入结果数组
else if (!oushu.empty())
{
while (!oushu.empty())
{
cur = oushu.top();
data.push_back(oushu.top()->val);
oushu.pop();
if (cur->right != nullptr)
jishu.push(cur->right);
if (cur->left != nullptr)
jishu.push(cur->left);
}
result.push_back(data);
}
}
return result;
}
};