从上到下打印二叉树Ⅲ
题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7],
返回其层次遍历结果:
提示:
节点总数 <= 1000
解题思路
这题与上一题打印二叉树又有点不同之处是在于:上一题是从上到下打印每一层,并将每一层保存至数组中;而本题是要求从上到下左右交替打印每一层,同时也将每一层保存至数组中。所以本题我们先定义一个标志位来判断左右的打印顺序,规定从左往右打印为真,从右往左打印为假,同时再借助双端队列来完成解答。
算法大致流程:
- 判断根节点是否为空,若为空直接返回空
- 定义一个标志位,规定从左往右打印为真,从右往左打印为假
- 若队列不为空进入循环
- 得到这一层的节点个数n,当节点个数不为空时进入第二次循环
- 当flag为真,当前行从左往右打印,将下一行从左往右存储在队尾
- 当flag为假,当前行从右往左打印,将下一行从右往左存储在队首
- 当n=0时退出第二次循环,然后将标志位取反
- 当队列为空时推出第一层循环,返回容器res
代码展示
代码如下:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
if(!root) return {};
//创建一个双端数组
deque<TreeNode*> d;
d.push_back(root);
//定义一个标志位,从左往右打印为真,从右往左打印为假
bool flag=true;
while(!d.empty())
{
//得到这一层的节点个数
int n=d.size();
//创建vector容器存储节点值
vector<int> tem;
TreeNode *t;
while(n>0)
{
//当flag为真,当前行从左往右打印,将下一行从左往右存储在队尾
if(flag)
{
t=d.front();
d.pop_front();
if(t->left) d.push_back(t->left);
if(t->right) d.push_back(t->right);
}
//当flag为假,当前行从右往左打印,将下一行从右往左存储在队首
else
{
t=d.back();
d.pop_back();
if(t->right) d.push_front(t->right);
if(t->left) d.push_front(t->left);
}
//当前行节点个数减1
n--;
//将当前节点插入到tem
tem.push_back(t->val);
}
//进入下一行将标志位取反
flag=!flag;
//将存储每行节点的tem插入到res中
res.push_back(tem);
}
return res;
}
};
执行用时:4 ms, 在所有 C++ 提交中击败了90.49%的用户
内存消耗:12.3 MB, 在所有 C++ 提交中击败了95.23%的用户