题解 | #按之字形顺序打印二叉树#
按之字形顺序打印二叉树
http://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0
1 思路
累计耗时超过1小时!!
- 請站在模板的肩上
- 自己尝试利用双端队列的代码,其实可以用普通队列
- 【要点】主要是内部vector插入的时候,选择尾部更新,还是头部更新的问题,这样就不用排序了,
- 难点不是queque pop, 而是在内部数据插入的维护上;
难点的地方 2处
如图圈主的地方
vector操作
层次遍历 /BFS模板的认识
更多的参考https://blog.nowcoder.net/n/b169fcd8c60b446eae5869a319a3c7ef
2 code
//自己尝试利用双端队列的代码,其实可以用普通队列
//主要是内部vector插入的时候,选择尾部更新,还是头部更新的问题,这样就不用排序了
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
#include <deque>
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
int level = 1;
vector<vector<int> > finalV;
if(!pRoot){
return finalV;
}
deque<TreeNode*> dq;//dq(pRoot);
dq.push_back(pRoot);
int curr = 0;
TreeNode* currNode = NULL;
while( !dq.empty()){
int sz = dq.size();//每一层数目
vector<int> innerV;
while( sz--){
//if( level%2 ==1){
currNode = dq.front();
curr = dq.front()->val;
dq.pop_front();
//}else{
// currNode = dq.back();
// curr = dq.back()->val;
// dq.pop_back();
// }
if( level%2 ==1){
innerV.push_back(curr);
}else{
innerV.insert(innerV.begin(),curr);//similar to push front
}
if(currNode->left)
dq.push_back(currNode->left);
if(currNode->right)
dq.push_back(currNode->right);
}
level++;
finalV.push_back(innerV);
}
return finalV;
}
};