题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
示例1
输入
{8,6,10,5,7,9,11}
返回值
[[8],[10,6],[5,7,9,11]]
思路
这里一看就是变形的二叉树层序遍历。
先来看看当时二叉树得层序遍历时怎么做的:
二叉树的层序遍历
再来看看进阶版的层序遍历:不用记住当前层数的,但是要按层返回:
把二叉树打印成多行
这里属于进阶版plus,和之前的不同之处在于这里需要按特定的层数特征返回,因此在计算的过程中要想办法记住当前遍历的层数。
核心还是用队列实现
在每次遍历开始前记住当前队列的大小和层数,遍历完当前队列的尺寸时,输出一次,并且当是偶数层的时候,反转一下
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
if (!pRoot) return {};
vector<vector<int>> ret;
queue<TreeNode*> q;
q.push(pRoot);
int level=0;//记录层数
while(!q.empty())
{
int s=q.size();//记住当前层次的数量,
vector<int> temp;
while (s)//例如1层就是1,循环一次就结束一下,这时队列剩下的是当前层上结点的子节点了
{
temp.push_back(q.front()->val);
if (q.front()->left) q.push(q.front()->left);
if (q.front()->right) q.push(q.front()->right);
q.pop();
s--;
}
level++;//上面的循环退出说明遍历完一层了,层数++
if (level%2==0)//偶数层就要反转
{
reverse(temp.begin(), temp.end());
}
ret.push_back(temp);//输出当前层的遍历结果
}
return ret;
}
};