原题
思想
这一题主要考查二叉树的层次遍历,最常用的方法就是用队列去做,但是需要将二叉树的节点值存到一个二维数组中去,然后返回,这需要在队列存储时候做一些操作,通过NULL来标记二叉树的层次
代码和详解
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
//分配一个二维向量
vector<vector<int>> result;
//用队列来存储二叉树结点值
queue<TreeNode *> q;
//如果根节点为空,则返回
if (!root)
{
return result;
}
//将根节点先放入队列中
q.push(root);
//再将NULL放入队列中,NULL是为了标记那一层的作用
q.push(NULL);
//cur是为了存储每一层的节点值
vector<int> cur;
//循环进行二叉树层次遍历,直到队列为空
while (!q.empty())
{
//去除队列的第一个值
TreeNode* t = q.front();
//出队列
q.pop();
//如果t==NULL则证明当前层的遍历已经结束,需要将这一层存在cur中的值放到result中
if (t == NULL)
{
result.push_back(cur);
//将cur大小重新置为0
cur.resize(0);
//如果队列不为空,证明还没有遍历结束,继续讲NULL入队列作为标记
if (q.size() > 0)
{
q.push(NULL);
}
}
else
{
//将当前的节点值存到cur中
cur.push_back(t->val);
//如果左孩子不为空,则入队列
if (t->left)
{
q.push(t->left);
}
//如果右孩子不为空,则入队列
if (t->right)
{
q.push(t->right);
}
}
}
//返回结果
return result;
}
};