题目简述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
算法一:BFS
时间复杂度:O(N)
思路:
在遍历每层的时候记录下该点的层数,每层在队列中的顺序都是有序的。
即:如果将一个三层的满二叉树,从跟节点依次放入队列中,那么层数顺序是按1,2,2,3,3,3,3排列。
那么我们将在同一层的放在一个数组里即可。
代码:
/*
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> > res;
if(!pRoot) return res;
queue<pair<TreeNode*,int> > q;
q.push({pRoot,0});
int k=0;
vector<int> p;
while(q.size()){
auto t=q.front();
q.pop();
auto t1=t.first;
int pos=t.second;
if(t1->left) q.push({t1->left,pos+1}); //先左后右遍历树的节点,保证了顺序打印
if(t1->right) q.push({t1->right,pos+1});
if(k==pos){
p.push_back(t1->val);
}
else{
k=pos; //层树标记
res.push_back(p); //将上一层的值放入res中
p.clear();//清除上一层数组的值
p.push_back(t1->val); //将第k层的第一个点放进去
}
}
res.push_back(p);//最后一层放入res中
return res;
}
}; 算法二:
时间复杂度:O(N)
思路:
从根节点开始,不断往从左往右下遍历,并在遍历的时候将下一个节点放入队列中。
这样可以保证,队列中的节点都是按照每层从左往右顺序排列。
那么我们如果从根节点可以推出第二层的大小,从第二层可以推出第三层的值,......
图解:
代码:
/*
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) {
queue<TreeNode*> q;
vector<vector<int> > ans;
if(pRoot) q.push(pRoot);//如果是空则直接返回
while(q.size())
{
int len=q.size();//每一层的数量
vector<int> res;
for(int i=0;i<len;i++){//保证了每层都被清空
auto root=q.front();
q.pop();
if(root->left) q.push(root->left);//先左后右放入队列中保证了,顺序性。
if(root->right) q.push(root->right);
res.push_back(root->val);
}
ans.push_back(res);
}
return ans;
}
}; 
京公网安备 11010502036488号