Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2023, 14:57   #1
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
По умолчанию Проверка более общего свойства дерева поиска

помогите решить
теперь нужно более общее свойство. Дереву разрешается содержать
равные ключи, но они всегда должны находиться в правом поддереве.
Формально, двоичное дерево называется деревом поиска, если для
любой вершины её ключ больше всех ключей из её левого поддерева
и не меньше всех ключей из правого поддерева.
Ограничения. 0 ≤ n ≤ 105; −231 ≤ keyi ≤ 231 −1 (таким образом, в ка-
честве ключей допустимы минимальное и максимальное зна-
чение 32-битного целого типа, будьте осторожны с переполне-
нием); −1 ≤ lefti, righti ≤ n − 1. Гарантируется, что вход зада-
ёт корректное двоичное дерево: в частности, если lefti 6 = −1 и
righti 6 = −1, то lefti 6 = righti; никакая вершина не является сыном
двух вершин; каждая вершина является потомком корня.
Пример.
Вход:
3
2 1 2
1 -1 -1
3 -1 -1
Выход:
CORRECT
Код:
#include <iostream>
#include <vector>

using namespace std;

struct Node {
    int key;
    int left;
    int right;
};

bool is_bst(const vector<Node>& tree, int node, int min_key, int max_key) {
    if (node == -1) {
        return true;
    }

    if (tree[node].key < min_key || tree[node].key >= max_key) {
        return false;
    }

    const int& left = tree[node].left;
    const int& right = tree[node].right;

    // Проверяем, являются ли левый и правый потомки действительными узлами
    if (left != -1 && (left < 0 || left >= tree.size())) {
        return false;
    }

    if (right != -1 && (right < 0 || right >= tree.size())) {
        return false;
    }

    // Рекурсивно проверяем левое и правое поддеревья
    return is_bst(tree, left, min_key, tree[node].key)
        && is_bst(tree, right, tree[node].key, max_key);
}

int main() {
    int n;
    cin >> n;

    vector<Node> tree(n);
    for (int i = 0; i < n; i++) {
        cin >> tree[i].key >> tree[i].left >> tree[i].right;
        if (tree[i].left != -1 && (tree[i].left < 0 || tree[i].left >= n)) {
            cout << "INCORRECT" << endl;
            return 0;
        }
        if (tree[i].right != -1 && (tree[i].right < 0 || tree[i].right >= n)) {
            cout << "INCORRECT" << endl;
            return 0;
        }
    }

    if (is_bst(tree, 0, -2147483648, 2147483647)) {
        cout << "CORRECT" << endl;
    } else {
        cout << "INCORRECT" << endl;
    }

    return 0;
}
Runtime error

Error:
Segmentation fault
ChestIotVaga вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка орфографии с помошью дерева бинарного поиска videolord C# (си шарп) 1 23.05.2011 20:30
[C] Абстрактные типы данных. Реализация дерева общего вида. Dju Помощь студентам 0 11.05.2009 18:11