leetcode原题链接:二叉树的层序遍历
题目描述
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1] 输出:[[1]]
示例 3:
输入:root = [] 输出:[]
提示:
- 树中节点数目在范围
[0, 2000]
内 -1000 <= Node.val <= 1000
解题方法:用队列q保存下一层的结点,在每一层未开始遍历时,队列q的大小表示下一层结点的个数。这里需要回顾下c++队列的常用函数。C++队列的头文件:<queue>,常用函数跟栈很像,只是栈top()表示栈顶元素,而queue的fron()表示队首元素。queue常用函数如下:
front():返回队首元素
back():返回队尾元素
empty():返回队列是否为空
size(): 队列的大小
push(): 队尾复制插入
emplace(): 队尾移动插入, c++11
push_range(): 队尾插入一个区间的元素, c++23
pop(): 弹出队首元素
swap(): 两个队列相互交换元素, c++11
C++代码
#include <vector>
#include <queue>
/**
* 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) {
if (!root) {
return {};
}
std::queue<TreeNode*> q;
std::vector<std::vector<int>> result;
TreeNode* p = root;
q.push(p);
while (!q.empty()) {
result.emplace_back(std::vector<int>());//申请result的第一维空间
int q_size = q.size(); //当前遍历到的这一层的节点数
for (int i = 0; i < q_size; i++) {
TreeNode* p_front = q.front();
q.pop();
if (!p_front) {
continue;
}
result.back().emplace_back(p_front->val);//更新第二维空间
if (p_front->left) {
q.emplace(p_front->left);
}
if (p_front->right) {
q.emplace(p_front->right);
}
}
}
return result;
}
};