题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路:用到了两个辅助栈s1和s2,初始时s1加入根节点,当s1和s2任意一个不为空时,就访问s1或s2中的节点,在访问时将他们的子节点加入到另一个栈中。直到两个栈都为空,此时相当于树的之字遍历已经完成了。
实现:C++
/*
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<int>level;//一层
vector<vector<int>> levellist;//存储的数组
if(pRoot==NULL)
{
return levellist;
}
stack<TreeNode*>s1;//栈1,1往2里面添加时是左子树右子树
stack<TreeNode*>s2;//栈2,2往1里面添加时是右子树左子树
s1.push(pRoot);
while(!s1.empty()||!s2.empty())
{
while(!s1.empty())
{
TreeNode *p = s1.top();
s1.pop();
level.push_back(p->val);
if(p->left!=NULL)
{
s2.push(p->left);
}
if(p->right!=NULL)
{
s2.push(p->right);
}
}
//当一个栈访问完之后,将遍历的数值加入levellist,同时清空level
levellist.push_back(level);
level.clear();
while(!s2.empty())
{
TreeNode *q = s2.top();
s2.pop();
level.push_back(q->val);
if(q->right!=NULL)
{
s1.push(q->right);
}
if(q->left!=NULL)
{
s1.push(q->left);
}
}
if(!level.empty())
{
levellist.push_back(level);
level.clear();
}
}
return levellist;
}
};
finished!!!