题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推
思路:利用两个栈,奇数行存在stack1,偶数行存在stack2,若stack1不为空,将stack1中的结点取出,查找该节点的子结点放入stack2中,对于stack2也采用相同处理,注意:取子结点时的顺序
/*
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> > ret;
vector<vector<int> > Print(TreeNode* pRoot) {
if(pRoot == NULL)
return ret;
stack<TreeNode*> lLeft;
stack<TreeNode*> rRight;
lLeft.push(pRoot);
while(!lLeft.empty() || !rRight.empty())
{
vector<int> tmp_left;
vector<int> tmp_right;
while(!lLeft.empty())
{
TreeNode* tmp = lLeft.top();
tmp_left.push_back(tmp->val);
lLeft.pop();
if(tmp->left)
rRight.push(tmp->left);
if(tmp->right)
rRight.push(tmp->right);
}
if(!tmp_left.empty())
ret.push_back(tmp_left);
while(!rRight.empty())
{
TreeNode* tmp = rRight.top();
tmp_right.push_back(tmp->val);
rRight.pop();
if(tmp->right)
lLeft.push(tmp->right);
if(tmp->left)
lLeft.push(tmp->left);
}
if(!tmp_right.empty())
ret.push_back(tmp_right);
}
return ret;
}
};