题目
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1] 输出:[[1]]
示例 3:
输入:root = [] 输出:[]
分析
二叉树的层序遍历可以借助队列来实现。层序遍历的核心思路是从根节点开始,依次访问每一层的节点,并且从左到右逐个访问。
广度优先搜索
首先判断根节点是否为空,若为空则直接返回空的结果。初始化一个队列,将根节点加入队列。
当队列不为空时,进行以下操作:
- 记录当前队列的大小,这个大小就是当前层的节点数量
- 遍历当前层的所有节点,将节点的值存入当前层的结果数组中,同时将节点的左右子节点(如果存在)加入队列
- 将当前层的结果数组加入最终结果
时间复杂度:O(),
为二叉树节点的个数
空间复杂度:O(),
是二叉树中节点数最多的那一层的节点数
cpp
class Solution {
public:
std::vector<std::vector<int>> levelOrder(TreeNode* root) {
std::vector<std::vector<int>> result;
if (root == nullptr) {
return result;
}
std::queue<TreeNode*> nodeQueue;
nodeQueue.push(root);
while (!nodeQueue.empty()) {
int levelSize = nodeQueue.size();
std::vector<int> currentLevel;
for (int i = 0; i < levelSize; ++i) {
TreeNode* currentNode = nodeQueue.front();
nodeQueue.pop();
currentLevel.push_back(currentNode->val);
if (currentNode->left) {
nodeQueue.push(currentNode->left);
}
if (currentNode->right) {
nodeQueue.push(currentNode->right);
}
}
result.push_back(currentLevel);
}
return result;
}
};