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