實現一個函數按照之字形順序打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右到左的順序打印,第三行再按照從左到右的順序打印,其他行以此類推。
/**
* 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)
在尾部添加一個元素