题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
考察点:基于队列的算法;二叉树的理解;引用其他变量方便运算
思路:引入本层待打印节点和下层节点来计算何时换行打印。
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>> result;
if (pRoot == NULL)
return result;
queue<TreeNode*> q;
q.push(pRoot);//根节点入队
//初始化两个数量变量
int toBePrint = 1;//本层还有多少需要打印的节点
int nextLevel = 0;//下一层的节点数
vector<int> re; //声明暂存数组
while (!q.empty())//队列不为空,循环进行节点出队,孩子入队
{
TreeNode* pNode = q.front();
re.push_back(pNode->val);
if (pNode->left != NULL)//左孩子
{
q.push(pNode->left);
nextLevel++;
}
if (pNode->right != NULL) //右孩子
{
q.push(pNode->right);
nextLevel++;
}
q.pop();//出队
toBePrint--;//待打印节点减少
if (toBePrint == 0)//减少到0,应该打印下一层了
{
result.push_back(re);//结果收集
re.clear();//暂存数组清空
toBePrint = nextLevel;
nextLevel = 0;//修改两个量
}
}
return result;
}
};