С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/55: Рейтинг темы: голосов - 55, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 3

Проверка корректности двоичного дерева

24.03.2017, 00:21. Показов 10121. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Задача такая,

Свойство двоичного дерева поиска можно сформулировать следующим образом: для каждой
вершины дерева V выполняется следующее условие:
• все ключи вершин из левого поддерева меньше ключа вершины V ;
• все ключи вершин из правого поддерева больше ключа вершины V .
Дано двоичное дерево. Проверьте, выполняется ли для него свойство двоичного дерева поиска.
Формат входного файла
Входной файл содержит описание двоичного дерева. В первой строке файла находится число
N (0 ≤ N ≤ 200000) — число вершин в дереве. В последующих N строках файла находятся описания
вершин дерева. В (i + 1)-ой строке файла (1 ≤ i ≤ N) находится описание i-ой вершины, состоящее
из трех чисел Ki, Li, Ri разделенных пробелами — ключа в i-ой вершине (|Ki| ≤ 10^9), номера левого
ребенка i-ой вершины (i < Li ≤ N или Li = 0, если левого ребенка нет) и номера правого ребенка
i-ой вершины (i < Ri ≤ N или Ri = 0, если правого ребенка нет).
Формат выходного файла
Выведите «YES», если данное на входе дерево является двоичным деревом поиска, и «NO», если
не является.



пример входного файла:
3
5 2 3
6 0 0
4 0 0

пример выходного файла:
NO

пример входного файла:
6
-2 0 2
8 4 3
9 0 0
3 5 6
0 0 0
6 0 0

пример выходного файла:
YES



Я считываю само дерево, далее вызываю функцию, которая начинает от корня дерева и в случае, если с корнем и его детьми все ок, запускается для каждого из детей. Считаю, что корень дерева - первый элемент массива (в условии не сказано, но вроде это так)
на всех моих тестах работало, но в проверяющей системе не проходит тест 8
вот мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <fstream>
struct BinarySearchTree
{
    int value;
    int left;
    int right;
};
bool isBST(BinarySearchTree *, int const &);
int main()
{
    std::ifstream fin("input.txt");
    std::ofstream fout("check.txt");
    int n;
    fin >> n;
    if (n == 0)
    {
        fout << "YES";
        fout.close();
        fin.close();
        return 0;
    }
    BinarySearchTree *tree;
    tree = new BinarySearchTree[n + 1];
    for (int i = 1; i <= n; i++)
        fin >> tree[i].value >> tree[i].left >> tree[i].right;
    if (isBST(tree, 1))
        fout << "YES";
    else
        fout << "NO";
    fin.close();
    fout.close();
    return 0;
}
bool check(BinarySearchTree *tree, int const &j, int const &k, int const &c)
{
    switch (k)
    {
    case 0:
        if (tree[j].value > c)
            return false;
        break;
    case 1:
        if (tree[j].value < c)
            return false;
        break;
    }
    if (tree[j].left != 0 && !check(tree, tree[j].left, k, c))
        return false;
    if (tree[j].right != 0 && !check(tree, tree[j].right, k, c))
        return false;
    return true;
}
bool isBST(BinarySearchTree *tree, int const &j)
{
    if (tree[j].left == 0 && tree[j].right == 0)
        return true;
    if (tree[j].left != 0 && tree[j].value < tree[tree[j].left].value)
        return false;
    if (tree[j].right != 0 && tree[j].value > tree[tree[j].right].value)
        return false;
    if (tree[j].left != 0 && !check(tree, tree[j].left, 0, tree[j].value))
        return false;
    if (tree[j].right != 0 && !check(tree, tree[j].right, 1, tree[j].value))
        return false;
    if (tree[j].left != 0 && isBST(tree, tree[j].left) == false)
        return false;
    if (tree[j].right != 0 && isBST(tree, tree[j].right) == false)
        return false;
    return true;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.03.2017, 00:21
Ответы с готовыми решениями:

Пример двоичного дерева
Здравствуйте! Возникла мысль попробовать реализовать двоичное дерево в c++ для этого решил сначала рассмотреть какие-нибудь примеры в...

Проверка корректности ввода
****Сразу извините, что заголовок на английском, при попытке написать по русски, вылетала ошибка.**** День добрый. Решил, что пора учить...

Проверка корректности ввода
Есть класс Point, в котором поля int X, int Y, int Z; (X должен быть больше Y) Есть конструктор без параметров Point::Point(){ cout...

2
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,989
Записей в блоге: 32
24.03.2017, 01:50
Однако, вижу 3 возможных варианта:
- не проходит по времени
- неправильно строится дерево
- неправильно проверяется дерево

Навскидку кот. Конечно при 200000 элементах надо !! по списку заменить на вектор / сет / мап или т.п. со скоростью доступа О(1) / О(log n)
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{-# LANGUAGE DeriveFunctor, DeriveFoldable, DeriveTraversable #-}
 
data BT a = E | N (BT a) a (BT a) deriving (Show, Foldable)
 
task = valid . make. map (map (\x -> read x::Int) . words) . tail . lines
 
make = go 1 where
    go 0 _ = E
    go i s = N (go l s) k (go r s) where [k,l,r] = s !! (i-1)
 
valid E = True
valid (N l k r) = all (<k) l && all (>k) r && valid l && valid r
 
main = getContents >>= print . task
Если есть ссылка на проверяющую систему, можно проверить.
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 3
24.03.2017, 21:35  [ТС]
Честно говоря синтаксис совсем непонятен) в принципе проблем с реализацией того или иного алгоритма нет, вопрос в том, что раз система не принимает решение (которое было переписано в различных вариациях схожих по смыслу), то проблема в самом алгоритме)
З.Ы. решение выдает неверный ответ, а по времени все ок) возможно кто-нибудь посоветует какой-нибудь алгоритм, или укажет, чего я не учитываю или не вижу?...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.03.2017, 21:35
Помогаю со студенческими работами здесь

Проверка корректности данных
Вводятся числа. Необходимо проверить, что данные введены действительно числового формата (double, например). Если вводятся буквы, другие...

Проверка корректности даты
Заданы 2 числа DD и ММ. Проверьте, может ли число ММ быть номером месяца, а число DD - номером дня. Проверять нужно сразу 5 дат.

Не работает проверка корректности
Я ввожу даты, и их нужно проверять на корректность. Число и месяц проверяются нормально таким же способом, а вот именно год не хочет...

Удаление корня двоичного дерева
двоичное дерево состоит только из ptr корень двоичного дерева как удалить этот корень?

Алгоритм реализации двоичного дерева
Нужно написать реализацию двоичного дерева с использованием шаблонов в упрощенном виде следуя конвенциям STL контейнеров. Основные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru