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

posted @ 2020-06-19 13:51  海拉尔  阅读(213)  评论(0编辑  收藏  举报