题目来源
102. 二叉树的层序遍历
面试题32 - II. 从上到下打印二叉树 II
题目描述
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){
}
};
题目解析
关键点:怎么把各个层的数分开,存到一个二维向量里面。
广度优先搜索
思路:
- 建立一个queue,然后把根节点放进去,接下来需要找根节点的左右两个子节点
- 先去掉根节点,此时queue里的元素就是下一层的所有节点,用一个for循环遍历它们,然后存到一个一维向量里面,遍历完成之后再把这个一维向量存到二维向量里面
- 以此类推,就可以完成层次遍历了
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root){
if(root == nullptr){
return {};
}
std::vector<std::vector<int>> res;
std::queue<TreeNode *> q({root});
while (!q.empty()){
std::vector<int> oneLevel;
for (int i = q.size(); i > 0; --i) {
TreeNode *t = q.front(); q.pop();
oneLevel.push_back(t->val);
if(t->left){
q.push(t->left);
}
if(t->right){
q.push(t->right);
}
}
res.push_back(oneLevel);
}
return res;
}
};
递归
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
levelorder(root, 0, res);
return res;
}
void levelorder(TreeNode* node, int level, vector<vector<int>>& res) {
if (!node) return;
if (res.size() == level) res.push_back({});
res[level].push_back(node->val);
if (node->left) levelorder(node->left, level + 1, res);
if (node->right) levelorder(node->right, level + 1, res);
}
};