- 二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector <vector <int>> ret;
if (!root) {
return ret;
}
queue <TreeNode*> q;
q.push(root);
while (!q.empty()) {
//获取当前队列的长度
int currentLevelSize = q.size();
ret.push_back(vector <int> ());
//当前队列全部遍历完输出不同层
for (int i = 1; i <= currentLevelSize; ++i) {
auto node = q.front(); q.pop();
ret.back().push_back(node->val);
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
}
return ret;
}
};
这是一段用C++编写的二叉树的层序遍历代码。它使用队列数据结构来实现遍历。代码首先创建一个空的嵌套向量 ret
,它最终将按层存储二叉树的节点值。如果根节点为空,代码立即返回 ret
。
否则,它用根节点初始化一个队列,并进入一个循环。在循环中,它获取队列的当前大小,这代表当前层节点的数量。然后它在 ret
中创建一个新的空向量,这将存储此级别上的节点值。
接下来,代码迭代处理当前级别的节点,将它们从队列中弹出并将其值添加到 ret
后面的向量中。如果节点具有左或右子节点,则将它们添加到队列中,以在下一级别中处理。
一旦处理完当前级别的所有节点,循环就会为下一级别重复,直到队列中没有更多的节点。最后,代码返回 ret
,它现在包含按层存储的二叉树的节点值。
下面是对每一行代码的详细解释:
vector <vector <int>> ret;
这一行定义了一个嵌套向量 ret
,用于存储二叉树节点值的层序遍历结果。
if (!root) {
return ret;
}
如果根节点为空,也就是二叉树为空树,那么直接返回空的 ret
向量。
queue <TreeNode*> q;
q.push(root);
定义了一个队列 q
,并将根节点压入队列。
while (!q.empty()) {
只要队列不为空,循环就会一直执行。
int currentLevelSize = q.size();
ret.push_back(vector <int> ());
获取当前队列的大小,即当前层级的节点数量,并在 ret
中添加一个新的空向量,用于存储该层级的节点值。
for (int i = 1; i <= currentLevelSize; ++i) {
auto node = q.front(); q.pop();
ret.back().push_back(node->val);
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
对于当前层级的所有节点进行遍历,逐个取出队首节点,将其值添加到 ret
的末尾向量中,并将其左右子节点压入队列中。
return ret;
最终返回存储节点值层序遍历结果的 ret
向量。