题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
之字形:
思路:
之字形:就是一层是从左向右,一层是从右向左。最初的想法是用一个计数点i,用i的奇偶来判断从右还是从左。
后来发现下一层开始遍历的点就是上一层最后放入的点,所以我们选择栈。由于来回变换所以我们要选择两个栈。就不用i来判断了。
vector的压入,弹出函数为:push_back() pop_back();(返回值为void)得到最后一个元素back() 得到第一个元素begin(),得到最后一个元素,back()
queue的压入,弹出函数为:push() pop();(返回值为void)队首元素front() 队尾元素back() 队列中元素个数size()
stack的压入,弹出函数为:push() pop() (返回值为void) 得到栈顶元素top() 队列元素size()
我的代码:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<int> in;
vector<vector<int>> out;
if(pRoot == NULL)
return out;
stack<TreeNode*> sta;
stack<TreeNode*> tmp;
sta.push(pRoot);
in.push_back(pRoot->val);
out.push_back(in);
in.clear();
TreeNode* ptmp;
while(!sta.empty())
{
while(!sta.empty())
{
ptmp = sta.top();
sta.pop();//外层先右后左
if(ptmp->right)
{
tmp.push(ptmp->right);
in.push_back(ptmp->right->val);
}
if(ptmp->left)
{
tmp.push(ptmp->left);
in.push_back(ptmp->left->val);
}
}
if(in.size())
{
out.push_back(in);
in.clear();
}
while(!tmp.empty())
{
ptmp = tmp.top();
tmp.pop();
if(ptmp->left)
{
sta.push(ptmp->left);
in.push_back(ptmp->left->val);
}
if(ptmp->right)
{
sta.push(ptmp->right);
in.push_back(ptmp->right->val);
}
}
if(in.size())
{
out.push_back(in);
in.clear();
}
}
return out;
}