题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
/*
思路:对二叉树进行层次遍历,利用一个队列来保存将要打印的结点。为了把二叉树的每一层结点单独打印到一行,
需要设置两个变量:一个表示当前层中还没有打印的结点数(currentLevels),另一个表示下一层结点的数目(nextLevels)
*/
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>> Value{};
if (pRoot == NULL)
return Value;
queue<TreeNode* > queNode;
queNode.push(pRoot);
vector<int> subValue; //辅助数组,保存当前层所有的结点值
int nextLevels = 0; //用来统计下一层的结点数
int currentLevels = 1; //用来标记当前层剩余的没有打印的结点数
while (!queNode.empty())
{
TreeNode* pNode = queNode.front();
queNode.pop();
subValue.push_back(pNode->val);
if (pNode->left != NULL)
{
queNode.push(pNode->left);
++nextLevels;
}
if (pNode->right != NULL)
{
queNode.push(pNode->right);
++nextLevels;
}
--currentLevels;
if (currentLevels == 0) //如果当前层结点已全部打印完毕
{
Value.push_back(subValue);
subValue.clear(); //清空,开始存下一层结点
currentLevels = nextLevels; //下一层要打印的结点数
nextLevels = 0; //置0,开始统计下一层结点数
}
}
return Value;
}
};