题目
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
解法1:迭代
层序遍历又为广度优先遍历。对于二叉树的层序遍历,在每一层从左到右按照先后顺序将节点保存至辅助队列中。由于在返回的结果需要集中逐层的显示结果,那么在访问队列元素前,需要先获取到当前队列中节点的个数,然后只处理对应个数的同一层数的节点,并且将节点的孩子节点继续加入至队列中。
代码如下:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if (root == nullptr) {
return {};
}
vector<vector<int>> result{};
queue<TreeNode*> buffer{}; // 辅助队列保存
buffer.push(root);
while (!buffer.empty()) {
size_t count = buffer.size(); // 获取当前层数的节点个数
vector<int> sub_result{};
sub_result.reserve(count);
for (size_t i = 0; i < count; ++i) {
root = buffer.front();
buffer.pop();
sub_result.push_back(root->val);
if (root->left != nullptr) {
buffer.push(root->left);
}
if (root->right != nullptr) {
buffer.push(root->right);
}
}
result.emplace_back(sub_result);
}
return result;
}
};
时间复杂度为O(n)
,空间复杂度为O(n)
,执行结果如下:
解法2:递归
对于层序遍历,也可使用递归的方式进行解决,不过在递归代码中,最重要的一点是需要节点感知到节点处于哪一层。注意:递归代码实际是深度优先遍历,只是由于递归函数直到自己当前处于哪一层,所以先将结果保存至对应的层。在执行顺序上并非广度优先遍历。
代码如下:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> result{};
levelOrder(root, 0u, result);
return result;
}
private:
void levelOrder(TreeNode* root, size_t level, vector<vector<int>>& result)
{
if (root == nullptr) {
return;
}
if (level >= result.size()) {
result.push_back({});
}
result[level].push_back(root->val);
levelOrder(root->left, level + 1, result);
levelOrder(root->right, level + 1, result);
}
};
时间复杂度为O(n)
,空间复杂度为O(n)
,执行结果如下: