Изучение обхода деревьев в порядке уровней в C++

Метод 1: использование очереди
Один из наиболее распространенных подходов к обходу порядка уровней — использование структуры данных очереди. Вот пример реализации:

#include <iostream>
#include <queue>
struct Node {
    int data;
    Node* left;
    Node* right;
};
void levelOrderTraversal(Node* root) {
    if (root == nullptr)
        return;
    std::queue<Node*> q;
    q.push(root);
    while (!q.empty()) {
        Node* current = q.front();
        q.pop();
        std::cout << current->data << " ";
        if (current->left)
            q.push(current->left);
        if (current->right)
            q.push(current->right);
    }
}

Метод 2: использование рекурсии и параметра глубины
Другой метод предполагает использование рекурсии и параметра глубины для отслеживания текущего уровня. Вот пример реализации:

#include <iostream>
struct Node {
    int data;
    Node* left;
    Node* right;
};
void printGivenLevel(Node* root, int level) {
    if (root == nullptr)
        return;
    if (level == 1)
        std::cout << root->data << " ";
    else if (level > 1) {
        printGivenLevel(root->left, level - 1);
        printGivenLevel(root->right, level - 1);
    }
}
int height(Node* node) {
    if (node == nullptr)
        return 0;
    else {
        int leftHeight = height(node->left);
        int rightHeight = height(node->right);
        return (leftHeight > rightHeight) ? (leftHeight + 1) : (rightHeight + 1);
    }
}
void levelOrderTraversal(Node* root) {
    int h = height(root);
    for (int i = 1; i <= h; i++)
        printGivenLevel(root, i);
}

Метод 3: использование вектора очередей
Альтернативный подход — использовать вектор очередей, где каждая очередь представляет уровень в дереве. Вот пример реализации:

#include <iostream>
#include <queue>
#include <vector>
struct Node {
    int data;
    Node* left;
    Node* right;
};
void levelOrderTraversal(Node* root) {
    if (root == nullptr)
        return;
    std::vector<std::queue<Node*>> levels(1);
    levels[0].push(root);
    int depth = 0;
    while (!levels[depth].empty()) {
        std::queue<Node*>& currentLevel = levels[depth];
        std::queue<Node*> nextLevel;
        while (!currentLevel.empty()) {
            Node* current = currentLevel.front();
            currentLevel.pop();
            std::cout << current->data << " ";
            if (current->left)
                nextLevel.push(current->left);
            if (current->right)
                nextLevel.push(current->right);
        }
        depth++;
        levels.push_back(nextLevel);
    }
}