说明:本博客所有内容为参考书籍以及他人博客总结,为个人学习笔记所用。
讲述看到这一题的思路
还是直接上,接着把!!!
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
//层序遍历的原理在于使用一个辅助的队列,根结点先入队,再将其数值存入tmp数组中
//再根结点出队,将其左右结点都入队,进行第二层遍历,每一次遍历的结尾标志为队列内所有已有结点都出队完成,其对应的左右结点都入队完成,每一层的遍历结果都存入tmp中,在每一层的遍历结尾将tmp的内容存入到res中
queue<TreeNode*>que;//设置辅助队列
vector<vector<int>>res;
//根结点先入队,这么讲吧,这个要是没有根节点,压根就不需要在搞什么入不入的问题了
if(root != nullptr)
que.push(root);//看清楚这个进入队列的基本操作!!!
while(! que.empty())
{
//每一层遍历以前都初始化tmp
vector<int> tmp;
//这里需注意由于在for循环的执行过程中que.size()的值会进行更改,因此que.size()只能作为i的起点而不是终点
for(int i = que.size(); i > 0; --i)
{
root = que.front();
que.pop();
//在出队列的时刻进行打印,出队列的同时左右结点都入队列
tmp.push_back(root -> val);
//在出队列的时候,在进行遍历下面的这些节点
//比如说是:这个节点的左节点,以及其的右节点的情况的发生
if(root -> left != nullptr)
que.push(root -> left);
if(root -> right != nullptr)
que.push(root -> right);
}
//将当前层结果 tmp 添加入 res 。
res.push_back(tmp);
}
return res;//最后是要进行打印整个队列的
}
};
作者:烟花真的易冷
链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/solutions/2759597/102-er-cha-shu-de-ceng-xu-bian-li-by-yan-18p0/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
全写在这个注释代码里了。
自己在进行复习一下:
public:
vector<vector<int>> levelOrder(TreeNode* root)
queue<TreeNode*>que;//设置辅助队列
vector<vector<int>>res;
//根结点先入队,这么讲吧,这个要是没有根节点,压根就不需要在搞什么入不入的问题了
if(root != nullptr)
que.push(root);
//不为空,则继续进行循环操作
while(! que.empty())
{
vector<int> tmp;//创建一个中间变量
for(int i = que.size(); i > 0; --i)
{
root = que.front();是什么意思啊?
//
在编程上下文中,`root = que.front();` 这一行代码表示从一个名为 `que` 的队列(queue)中取出队首元素,并将其赋值给变量 `root`。
具体解释如下:
- `que` 是一个队列数据结构,通常用于按先进先出(FIFO)的原则存储和处理数据。
- `.front()` 是队列的一个成员函数,用于访问队列中的第一个元素,即队首元素,但不删除它。不同编程语言中的队列实现可能有所不同,但在 C++ STL 中的标准队列中,`.front()` 返回的是队列头部的对象引用或副本,但并不改变队列的状态。
- `root` 是一个变量,赋值操作 `root = que.front();` 将队列头部的元素赋值给 `root`。
如果是在与二叉树遍历相关的上下文中,这一行代码可能意味着将队列中的第一个(即最先入队的)二叉树节点赋值给 `root` 变量,以便进一步处理该节点及其子节点。例如,在层次遍历(BFS,广度优先搜索)算法中,常会用到这样的操作。
que.pop();
//这个的意思 上边
在编程尤其是C++的STL(标准模板库)中,`que.pop()` 表示从一个名为 `que` 的队列(queue)中移除并销毁第一个元素的操作。队列遵循FIFO(先进先出)原则,所以`pop()`函数会删除并返回(或在无返回值版本中只是移除)队列头部的元素,即最先加入队列的那个元素。
具体到C++ STL queue容器的`pop()`函数,其原型如下:
void pop();
此函数没有返回值,调用后会直接删除队列顶端的元素,队列的大小减一,并不影响队列中其他元素的位置。使用时需确保队列非空,否则行为未定义。
tmp.push_back(root -> val);
if(root -> left != nullptr)
que.push(root -> left);
if(root -> right != nullptr)
que.push(root -> right);
}
res.push_back(tmp);
}
return res;
}
};