题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
【新思路:】将只需要用一个队列就可。和层序遍历是一样的方式,但是在不同的行以不同的方向进入tmp数组,这里具体实现是通过用一个队列,队列里面的是一行的所有节点,创建一个队列节点大小的tmp数组,然后按照是该从左到右还是从右到左的方式给数组赋值 index=lefttoright ? i: n-1-i ;
思路:
要按照之打印。首先给的是根节点(代表从左到右了),接下来要从右到左。我们可以用两个栈来存放不同顺序的节点。stackL存放从左到右的,stackR存放从右到左的。当一边为空后要push入res中。
在压入
在压入每一行的时候,要注意判断是否为空的情况。
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>> res;
if(pRoot==nullptr)
reuturn res;
stack<TreeNode*> stackL;
stack<TreeNode*> stackR;
vector<int>tmp;
//将第一个放入栈中.流程打个样!
stackL.push(pRoot);
tmp.push_back(pRoot->val);
res.push_back(tmp);
tmp.clear();
TreeNOde* popNode;
while(!stackL.empty()|| !stackR.empty()) //当两者当中有一个不为空就继续
{
//判断左到右边的栈
while(!stackL.empty())
{
popNode=stackL.top();
stackL.pop(); //有顺序,从右到左
if(popNode->right!=nullptr)
{
stackR.push_back(popNode->right);
tmp.push_back(popNode->right->val);
}
if(popNode->left!=nullptr)
{
stackR.push_back(popNode->left);
tmp.push_back(popNode->left->val);
}
//左边栈解决完了,转移到右边的栈。要处理. 但是注意是当tmp不为空才可以push_back!
if(!tmp.empty())
{res.push_back(tmp);
tmp.clear();
}
while(!stackR.empty())
{
popNode=stackR.top();
stackR.pop(); //有顺序,left to right
if(popNode->left!=nullptr)
{
stackR.push_back(popNode->left);
tmp.push_back(popNode->left->val);
}
if(popNode->right!=nullptr)
{
stackR.push_back(popNode->right);
tmp.push_back(popNode->right->val);
}
//到这里之后某一边的被彻底解决了
if(!tmp.empty())
{res.push_back(tmp);
tmp.clear();
}
}
}
return res;
}