剑指OFFER题22------按牛客网通过率排序
时间:2018.12.22.1609
作者:Waitt
题目
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
时间限制:1秒 空间限制:32768K 热度指数:103052
解答
广度优先搜索:用队列实现
思路1
可以用两个队列,一个队列来向向量中保存值,另一个队列来保存这个队列对应的的下一层结点,进行迭代。
注:队列和向量等容器能够存储NULL,因此对于下一结点为NULL要进行排除
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
//辅助函数,要改变非本函数内定义的变量,应使用引用传递
void ceng(queue<TreeNode*> q1,vector<vector<int> > & a)
{
if(q1.empty())//当该队列为空时,则可直接返回
return;
vector<int> b;//向量:用来存放某一层结点的值
queue<TreeNode*> q2;//队列:用来存放本层节点对应的下一层结点
while(!q1.empty())
{
if(q1.front())//确保当前队列的头值不为NULL
{
int t=(q1.front()->val);
b.push_back(t);
}
if(q1.front()->left)//当该结点的左孩子不为NULL时,则存入队列2
q2.push(q1.front()->left);
if(q1.front()->right)//当该结点的右孩子不为NULL时,则存入队列2
q2.push(q1.front()->right);
q1.pop();
}
a.push_back(b);
ceng(q2,a);
}
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > a;
if(!pRoot)
return a;
queue<TreeNode*> q1;
q1.push(pRoot);
ceng(q1,a);
return a;
}
};
思路2
定义两个辅助变量判断每层是否输出完毕,通过循环实现
/*
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> > a;
if(!pRoot)
return a;
queue<TreeNode*> q1;//用于存放结点指针的队列
q1.push(pRoot);
while(!q1.empty())
{
int i=0,n=q1.size();//i用来进行每层输出的起始判断,n用来判断每层的结点数量
vector<int> b;//b用来保存每层的值
while(i<n)//每层的输出循环
{
if(q1.front())
b.push_back(q1.front()->val);
if(q1.front()->left)
q1.push(q1.front()->left);
if(q1.front()->right)
q1.push(q1.front()->right);
q1.pop();//弹出当前循环结点
i++;//控制变量的累加
}
a.push_back(b);
}
return a;
}
};