题目:
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
思路:
利用两个栈(定义一个两个栈的数组),用current和next分别指示当前层和下一层,如果当前层是奇数层(current=0),则下一层先入栈左节点再入栈右节点,当前层是偶数层(current=1),则下一层先入栈左节点再入栈右节点,如果存储当前层的栈为空,说明这一层元素已经全部打印,将temp存入result,temp清空准备存储下一层,current=1-current,next=1-next,交换存储用的栈。
补充:vector的删除操作
clear()函数的作用是清空容器中的内容,但并不回收内存
temp.clear();
可以通过swap()函数来巧妙的达到回收内存的效果
temp.swap(vector<TreeNode*>());
erase()用于清空容器中的内容以及释放内存,并返回指向删除元素的下一个元素的迭代器。
temp.erase(temp.begin()+i);
在线测试:
AC代码:
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > result;
if(pRoot==NULL)
return result;
stack<TreeNode*> sta[2];//定义一个有两个栈的数组
vector<int> temp;//存放每一行的元素
int current=0;//当前使用的栈
int next=1;//下一使用的栈
sta[current].push(pRoot);//将根节点压入当前使用的栈
while(!sta[0].empty()||!sta[1].empty())//两个栈都为空才结束循环
{
//先保存当前行对应栈的栈顶元素
TreeNode* pNode=sta[current].top();
temp.push_back(pNode->val);
sta[current].pop();
if(current==0)//当前层是奇数层,则下一层先入栈左节点再入栈右节点
{
if(pNode->left)
sta[next].push(pNode->left);
if(pNode->right)
sta[next].push(pNode->right);
}
else //当前层是偶数层,则下一层先入栈左节点再入栈右节点
{
if(pNode->right)
sta[next].push(pNode->right);
if(pNode->left)
sta[next].push(pNode->left);
}
if(sta[current].empty())
{
current=1-current;
next=1-next;
if(!temp.empty())
{
result.push_back(temp);
temp.clear();
}
}
}
return result;
}
};