题目描述:
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路:我们首先确定用哪种容器来实现,这里我们用两个栈实现比较简单,栈遵循先进后出的原则,并且只允许在固定的一端进行插入和删除元素操作。这里我用一个图来解释
/*
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 != NULL)
{
stack<TreeNode*> stack1, stack2;//定义两个栈,一个栈放奇数行,一个栈放偶数
stack1.push( pRoot);
while(!stack1.empty() || !stack2.empty() )//判断栈里面的元素是否为空
{
vector<int> ret1,ret2;//定义两个容器,一个容器放奇数行数据,一个容器放偶数行数据
TreeNode* cur = NULL;
while( stack1.empty()==0)//判断是否为空
{
//偶数行放栈2
cur = stack1.top();//栈顶元素
if( cur->left)//让偶数从右往左打印,所以将栈1元素的孩子从左往右压栈2
stack2.push(cur->left);
if(cur->right)
stack2.push(cur->right);
ret1.push_back(stack1.top()->val); //保存奇数行数据
stack1.pop();//出栈(先进的后出)
}
if(ret1.size())
result.push_back(ret1);//将奇数行数据整体保存到result容器中
while( !stack2.empty())
{
//奇数行放栈1
cur = stack2.top();//比如1已经打印了,此时首先访问5(后进的先出),
//它的右孩子进栈2(为了奇数行从右往左打印数据)
if(cur->right)
stack1.push( cur->right);
if(cur->left)
stack1.push( cur->left);
ret2.push_back(stack2.top()->val); //保存偶数行数据
stack2.pop();
}
if(ret2.size())
result.push_back(ret2);
}
}
return result;
}
};