题目
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]示例 2:
输入:root = [1] 输出:[[1]]示例 3:
输入:root = [] 输出:[]
分析
二叉树的层序遍历可以借助队列来实现。层序遍历的核心思路是从根节点开始,依次访问每一层的节点,并且从左到右逐个访问。
广度优先搜索
首先判断根节点是否为空,若为空则直接返回空的结果。初始化一个队列,将根节点加入队列。
当队列不为空时,进行以下操作:
- 记录当前队列的大小,这个大小就是当前层的节点数量
- 遍历当前层的所有节点,将节点的值存入当前层的结果数组中,同时将节点的左右子节点(如果存在)加入队列
- 将当前层的结果数组加入最终结果
时间复杂度:O(),
为二叉树节点的个数
空间复杂度:O(),
是二叉树中节点数最多的那一层的节点数
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;}
};