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变量,通过它的值判断该正向还是反向取值

  • 相关阅读:
    A:hover,A:visited 和A:active的区别
    什么是UrlEncode
    ERP系统BOM详细解析(一)
    ERP术语 [转]
    ERP理论的形成
    MRP的計算步驟
    ERP系统模块完全解析──物料编码分章(一)
    Transact SQL 常用语句以及函数
    SQL 2000中的触发器使用
    修改docker0默认IP地址
  • 原文地址:https://www.cnblogs.com/9527s/p/13162640.html
Copyright © 2011-2022 走看看