您的位置:首页 > 编程语言 > C语言/C++

C++详解Leetcode:102. Binary Tree Level Order Traversal

2017-07-22 17:44 1221 查看

原题



思想

这一题主要考查二叉树的层次遍历,最常用的方法就是用队列去做,但是需要将二叉树的节点值存到一个二维数组中去,然后返回,这需要在队列存储时候做一些操作,通过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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: