Бинарное дерево, заполнение элементами из массива и вывод на экран корня дерева, элементов идущих по левым ветвям, начиная с корня

Рейтинг: -2Ответов: 2Опубликовано: 17.04.2023

Создать бинарное дерево на языке программирования С++ и случайным образом заполнить его значениями из массива mass[4,14,5,76,1,9,13,66]. Вывести на экран корень дерева и вывести на экран все элементы дерева идущие по левым ветвям, начиная с корня. Помогите понять что не так, что нужно исправить (вместо элементов дерева идущим по левым ветвям, программа выводит на экран "1" )

#include <iostream>
#include <cstdlib>
#define NULL 0

using namespace std;

struct Node {
    int value;
    Node* left;
    Node* right;
};

Node* createNode(int value) {
    Node* node = new Node;
    node->value = value;
    node->left = NULL;
    node->right = NULL;
    return node;
}

void addNode(Node*& root, int value) {
    if (root == NULL) {
        root = createNode(value);
    }
    else if (value < root->value) 
{
        addNode(root->left, value);
    }
    else {
        addNode(root->right, value);
    }
}

void printLeftNodes(Node* root) {
    if (root == NULL) {
        return;
    }
    cout << root->value << " ";
    if (root->left != NULL) {
        printLeftNodes(root->left);
    }
}

int main() {
    int mass[] = { 4, 14, 5, 76, 1, 9, 13, 66 };
    int size = sizeof(mass) / sizeof(int);
    Node* root = NULL;

    for (int i = 0; i < size; i++) 
{
        addNode(root, mass[i]);
    }

    cout << "Корень дерева: " << root->value << endl;
    cout << "Элементы дерева, идущие по левым ветвям, начиная с корня: ";
    printLeftNodes(root->left);
    cout << endl;

    return 0;
 }

Ответы

▲ 0

Программа выводит на экран "1", потому что в функции printLeftNodes, после вывода значения корня, проверяется только левый потомок текущего узла, но не обрабатывается правый потомок. В результате, если корень имеет правого потомка, то программа не сможет вывести его значение.

Чтобы исправить это, нужно добавить также вызов printLeftNodes для правого потомка:

void printLeftNodes(Node* root) {
    if (root == NULL) {
        return;
    }
    cout << root->value << " ";
    if (root->left != NULL) {
        printLeftNodes(root->left);
    }
    if (root->right != NULL) {
        printLeftNodes(root->right);
    }
}

Теперь программа будет выводить на экран все элементы дерева, идущие по левым ветвям, начиная с корня.

▲ -2
    #include <iostream>
#include <cstdlib>
using namespace std;

struct Node {
    int value;
    Node *left;
    Node *right;
    Node(int val) {
        value = val;
        left = NULL;
        right = NULL;
    }
};

void insert(Node* &root, int value) {
    if (root == NULL) {
        root = new Node(value);
    }
    else {
        if (value < root->value) {
            insert(root->left, value);
        }
        else {
            insert(root->right, value);
        }
    }
}

void print(Node* root) {
    if (root != NULL) {
        print(root->left);
        cout << root->value << " ";
        print(root->right);
    }
}

int main() {
    int mass[] = {4, 14, 5, 76, 1, 9, 13, 66};
    int n = sizeof(mass)/sizeof(mass[0]);

    Node* root = NULL;

    for (int i = 0; i < n; i++) {
        insert(root, mass[i]);
    }

    print(root);

    return 0;
}