剑指offer:面试题61——按之字形顺序打印二叉树
题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路:
/*
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>> retval;
vector<int> levelval;
if(pRoot==NULL) return retval;
stack <TreeNode*> levels[2]; //采用两个栈保存节点
int current=0; //用来在两个栈间切换
int next=1;
levels[current].push(pRoot);
while(!levels[0].empty()||!levels[1].empty())
{
TreeNode* pNode=levels[current].top();
levelval.push_back(pNode->val);
levels[current].pop();
if(current==0)
{
if(pNode->left!=NULL) //设根为第1行,奇数行入栈顺序为先左后→
levels[next].push(pNode->left);
if(pNode->right!=NULL)
levels[next].push(pNode->right);
}
else
{
if(pNode->right!=NULL)
levels[next].push(pNode->right);
if(pNode->left!=NULL)
levels[next].push(pNode->left);
}
if(levels[current].empty()) //如果当前行节点都已经访问完了
{
retval.push_back(levelval);
while(levelval.size()!=0)
levelval.pop_back();
current=1-current; //开关法
next=1-next;
}
}
return retval;
}
};