从上到下打印二叉树Ⅲ(C++中等区)

从上到下打印二叉树Ⅲ

题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

例如:
给定二叉树: [3,9,20,null,null,15,7],
在这里插入图片描述
返回其层次遍历结果:
在这里插入图片描述
提示:
节点总数 <= 1000


解题思路

这题与上一题打印二叉树又有点不同之处是在于:上一题是从上到下打印每一层,并将每一层保存至数组中;而本题是要求从上到下左右交替打印每一层,同时也将每一层保存至数组中。所以本题我们先定义一个标志位来判断左右的打印顺序,规定从左往右打印为真,从右往左打印为假,同时再借助双端队列来完成解答。

算法大致流程:

  1. 判断根节点是否为空,若为空直接返回空
  2. 定义一个标志位,规定从左往右打印为真,从右往左打印为假
  3. 若队列不为空进入循环
  4. 得到这一层的节点个数n,当节点个数不为空时进入第二次循环
  5. 当flag为真,当前行从左往右打印,将下一行从左往右存储在队尾
  6. 当flag为假,当前行从右往左打印,将下一行从右往左存储在队首
  7. 当n=0时退出第二次循环,然后将标志位取反
  8. 当队列为空时推出第一层循环,返回容器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%的用户
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值