实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if(root == NULL) return {};
deque<TreeNode*> dequeNode;
vector<vector<int>> ret;
//根节点入队列
dequeNode.push_back(root);
//从左到右打印flage为true
bool flage = true;
while(!dequeNode.empty()){
//一层中含有的节点先用变量保存下来,不然后面有节点加入队列后size()有变化
int layerSize = dequeNode.size();
//一层的vector
vector<int> layerTempVal;
TreeNode *pNode = NULL;
for(int i = 0; i < layerSize; i++){
//从左到右打印,先取双队列的左边节点(前面),也就是右边放入节点,前面取出节点
if(flage){
//访问双队列节点,双队列前面取节点
pNode = dequeNode.front();
//删除该节点
dequeNode.pop_front();
//双队后面放节点,先左后右
if(pNode->left != NULL) dequeNode.push_back(pNode->left);
if(pNode->right != NULL) dequeNode.push_back(pNode->right);
}else{
//从右到左打印,先取双队列右边的节点(后面),也就是双队列的后面取节点
//前面放节点
pNode = dequeNode.back();
//删除该节点
dequeNode.pop_back();
//双队列前面放节点,先右后左
if(pNode->right != NULL) dequeNode.push_front(pNode->right);
if (pNode->left != NULL)dequeNode.push_front(pNode->left);
}
//pNode-val加入层节点vector
layerTempVal.push_back(pNode->val);
}
//一层结束了,该层的vector 加入大vector,flage 取逆
flage = !flage;
if(!layerTempVal.empty()){
ret.push_back(layerTempVal);
}
}
return ret;
}
};
C++:deque 的操作
元素访问操作:
(public member function )
直接访问指定位置的元素
直接访问指定位置的元素,指定位置超出有效范围会报出异常
访问首元素
访问尾元素
修改元素操作:
(public member function )
分配容器的内容
在尾部添加一个元素
在首部添加一个元素
在尾部删除一个元素
在首部删除一个元素
迭代器位置插入元素,或者插入连续的序列
擦除迭代器位置的元素,或者擦除连续的序列
交换两个容器的内容
清空容器的内容
emplace (C++11)
在迭代器位置插入元素(emplace使用直接构造函数,insert使用复制构造函数)
emplace_front (C++11)
在首部添加一个元素
emplace_back (C++11)
在尾部添加一个元素