zoukankan      html  css  js  c++  java
  • STL deque双端队列 解决 '之' 字形打印二叉树

    leetcode写题的时候遇到'之'字形打印二叉树,也可以说是Z字形,解题方法中遇到deque双端队列的使用,进一步学习了一下

    deque和vector类似

    基本初始化就不介绍了,可以参考博客https://www.cnblogs.com/linuxAndMcu/p/10260124.html

    容器最大容量 deq.max_size();

    增加元素:

    • 头部添加元素:deq.push_front(const T& x);
    • 末尾添加元素:deq.push_back(const T& x);
    • 任意位置插入一个元素:deq.insert(iterator it, const T& x);//插入函数第一个元素是迭代器
    • 任意位置插入 n 个相同元素:deq.insert(iterator it, int n, const T& x);
    • 插入另一个向量的 [forst,last] 间的数据:deq.insert(iterator it, iterator first, iterator last);
       int nums[]={1,2,3,4,5};
        deque<int>deq(nums,nums+5);//初始化方式之一
    
        
        
        deq.push_front(6);//6,1,2,3,4,5
        deque<int>::iterator iter = deq.begin();
        deq.insert(iter,7);//7,6,1,2,3,4,5 插入元素7
    
        iter = deq.begin();//此句缺少会出错,因为没次insert后迭代器会失效,需要重新设置
        deq.insert(iter,2,6);//iter位置插入两个6   6,6,7,6,1,...
    
    
        deque<int>deq2(2,9);//初始化一个deque 内含两个9
        iter = deq.begin();
        deq.insert(iter,deq2.begin(),deq2.end());//deq2插入deq的开始位置  9,9,6,6,7...
        
        for(deque<int>::iterator iter= deq.begin();iter!=deq.end();iter++)
        {
            cout<<*iter<<" ";
            
        }

    上文中迭代器失效,在insert和erase操作,都会使得删除点和插入点之后的元素挪位置,所以,插入点和删除掉之后的迭代器全部失效

    删除元素用法和插入类似

    • 删除头部:deq.pop_front();
    • 删除尾部:deq.pop_back();
    • 删除任意位置元素:deq.erase(iterator it);
    • 删除 [first,last] 之间的元素:deq.erase(iterator first, iterator last);
    • 清空所有元素:deq.clear();

    访问元素

      deq[5] 下标访问

      at 方法访问:deq.at(1); // 以上两者的区别就是 at 会检查是否越界,是则抛出 out of range 异常

      deq.front();访问第一个

      deq.back();访问最后一个

    其他

      deq.assign(3,1)//初始化三个1

      deq.swap(deq2)//交换deq和 deq2的值

    迭代器

      deq.rbegin()//返回指向最后一个元素的迭代器

      deq.rend()//返回指向开头的迭代器

      deq.cbegin()//常量迭代器,不可通过此更改值,deq.cend()同理

    回到leetcode的题中 之字形打印二叉树

    class Solution {
    public:
        vector<vector<int>> levelOrder(TreeNode* root) {
            vector<vector<int>> res;
            if (root==NULL)
                return res;
            bool flag = true; //从左向右打印为true,从右向左打印为false
            deque<TreeNode*> q;
            q.push_back(root);
            while (!q.empty())
            {
                int n = q.size();
                vector<int> out;
                TreeNode* node;
                while (n>0)
                {
                    if (flag) // 前取后放:从左向右打印,所以从前边取,后边放入
                    {
                        node = q.front();
                        q.pop_front();
                        if (node->left)
                            q.push_back(node->left);  // 下一层顺序存放至尾
                        if (node->right)
                            q.push_back(node->right);
                    }
                    else  //后取前放: 从右向左,从后边取,前边放入
                    {
                        node = q.back();
                        q.pop_back();
                        if (node->right)
                            q.push_front(node->right);  // 下一层逆序存放至首
                        if (node->left)
                            q.push_front(node->left);
                    }
                    out.push_back(node->val);
                    n--;
                }
                flag = !flag;
                res.push_back(out);
            }
            return res;
        }
    };

    bfs+双端队列解决

    设置好flag变量,通过它的值判断该正向还是反向取值

  • 相关阅读:
    ASP.NET + EF + SQL Server搭建个人博客系统新手系列(一):界面展示
    PHP中文乱码分类及解决办法大全
    分享一个根据具体的日期判断星座的PHP函数
    WHERE条件中or与union引起的全表扫描的问题
    linux下SVN CVS命令大全
    Ubuntu装完后要做的几件事
    Table被web编程弃用的原因
    PHP json_decode返回null解析失败原因
    powerpoint教程资料,PPT的
    一些matlab教程资源收藏,使用matlab编程的人还是挺多的
  • 原文地址:https://www.cnblogs.com/9527s/p/13162640.html
Copyright © 2011-2022 走看看