题目链接:https://www.nowcoder.com/ta/coding-interviews?query=&asc=true&order=&tagQuery=&page=1
题目描述:
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行
算法思想:本题采用层次遍历的思想,但本题的关键是如何取判断是否是一行的结束。我们可以采取在每行的结束之后插入一个空指针。当从队列的中取出一个空指针的时候表示这一层的结束并且下一层的所有节点都已经加入到了队列之中,可以继续在队列中插入一个空指针表示下一层的结束。
/*
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* root) {
vector<vector<int> > res;
if(root==NULL)
return res;
queue<TreeNode*> q;
q.push(root);
q.push(nullptr);
vector<int> lever;
while(q.size())
{
auto t=q.front();
q.pop();
//若t为空一行结束
if(!t)
{
if(lever.empty())
break;//退出while循环 这一层没有节点直接退出
res.push_back(lever);
lever.clear();
q.push(nullptr);
continue;
}
lever.push_back(t->val);
if(t->left)
q.push(t->left);
if(t->right)
q.push(t->right);
}
return res;
}
};