问题
思路
这个题的本质是返回每一层的节点,关键是增加每一层的最右侧节点作为标记。如果指针到达这个节点,那么证明此时队列里面的都是下一层的节点。关键是为什么不会有下下层的节点,因为现在访问到last,最多生成下一层的节点,不会有下下层。所以,此时队列中最后一个节点就是下一层的last.
代码
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
struct element {
TreeNode* p;
int level;
};
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int>> ret;
if(!pRoot) return ret;
element e;
e.p = pRoot;
e.level = 1;
TreeNode* last = pRoot; // 每一层最右侧节点
int cur = 2;
std::queue<element> que;
que.push(e);
vector<int> line;
while( !que.empty() ){
e = que.front(); que.pop();
line.push_back( e.p->val );
if( e.p->left ){
element tmp;
tmp.p = e.p->left;
tmp.level = cur;
que.push(tmp);
}
if( e.p->right ){
element tmp;
tmp.p = e.p->right;
tmp.level = cur;
que.push(tmp);
}
if( e.p == last ){
if( e.level % 2 == 1 ) ret.push_back(line);
else{
reverse( line.begin(), line.end() );
ret.push_back(line);
}
line.clear();
++cur;
last = que.back().p;
}
}
return ret;
}
};