好久没写水题了,今天水一波。。。
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
TreeQ1 TreeQ2
----------------------- -----------------------
空 1
----------------------- -----------------------
刚开始把头结点放到TreeQ2中(Q2其实就是该深度的等待队列)
Q1空闲,把Q2中的所有数调度到Q1中。
这时候,会发现,1会有两个儿子[2,3],因为[2,3]是深度为2的结点,故push到Q2中等待
TreeQ1 TreeQ2
----------------------- -----------------------
1 2 3
----------------------- -----------------------
把[1]存入vector的第一行,然后pop掉,稳妥,接着,调度[2,3]到Q1中,发现[2,3]有儿子[4,5,6,7],push到Q2中等待。
TreeQ1 TreeQ2
----------------------- -----------------------
2 3 4 5 6 7
----------------------- -----------------------

最后大家会发现,其实,Q2就是层序的过程。
附代码如下!!
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > ans;
vector<int > tmp;
queue<TreeNode* > TreeQ1;
queue<TreeNode* > TreeQ2;
TreeQ2.push(pRoot);
while(!TreeQ2.empty()){
while(!TreeQ2.empty()){
if(TreeQ2.front() != NULL){
TreeQ1.push(TreeQ2.front());
}
TreeQ2.pop();
}
while(!TreeQ1.empty()){
TreeQ2.push(TreeQ1.front()->left);
TreeQ2.push(TreeQ1.front()->right);
tmp.push_back(TreeQ1.front()->val);
TreeQ1.pop();
}
if(!TreeQ2.empty()){
ans.push_back(tmp);
tmp.clear();
}
}
return ans;
}
};
本文介绍了一种使用双队列实现的二叉树层序遍历算法,通过交替使用两个队列来确保每层节点能够从左至右依次输出,同时详细展示了算法的具体流程及其实现代码。

被折叠的 条评论
为什么被折叠?



