Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
43 / 37 / 17
Регистрация: 11.11.2009
Сообщений: 246

Бинарное дерево

24.09.2013, 22:30. Показов 1509. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброй ночи, форумчане.
Помогите пожалуйста с программой написания бинарного дерева.
Опять же занимался переносом с консольного приложения в обычное.
Но есть небольшая проблема: пример из книги Павловской не работает...
//---------------------------------------------------------------------------
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
#include <iostream.h>
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
 
struct Node{
int d;
Node *left;
Node *right;
};
Node *first (int d);
Node *search_insert(Node *root, int d);
void print_tree(Node *root, int l);
int main(){
int b[] = {10, 25, 20, 6, 21, 8, 1, 30};
Node *root = first(b[0]);
for (int i = 1; i<8; i++)search_insert(root, b[i]);
print_tree(root, 0);
return 0;}
 
Node *first (int d){
Node *pv = new Node;
pv->d = d;
pv->left = 0;
pv->right = 0;
return pv;
}
 
Node *search_insert(Node *root, int d) {
Node *pv = root *prev;
bool found = false;
while (pv && !found){
prev = pv;
if (d == pv->d) found = true;
else if (d < pv->d) pv =pv->left;
else pv = pv->right;}
if (found) return pv;
Node *pnew = new Node;
pnew->d = d;
pnew->left = 0;
pnew->right = 0;
if (d < prev->d)
prev->left == pnew;
else
prev->right = pnew;
return pnew;
}
 
void print_tree(Node *p, int level){
if (p){
print_tree(p->left, level +1); // вывод левого поддерева
for (int i = 0; i<level; i++)cout << " ";
cout << p->d << endl; // вывод корня поддерева
print_tree(p->right, level +1); // вывод правого поддерева
}
}
Если делать так, то он выдает ошибку на строке Node *pv = root *prev; о том, что не знает что такое prev.
Если между root и prev поставить запятую, то работает, но выводит только левые элементы (10,25,30);

(просто не очень понятно, то ли там запятая была, толи это просто артефакт при сканировании(склоняюсь к первому варианту, но все равно не работает))

Помогите пожалуйста исправить и понять, как именно строится дерево...
Я так понял, что root - это корень дерева, который каждый раз передается?
Node *pv = root *prev;
prev = pv;
C++
1
2
3
4
5
6
while (pv && !found){
prev = pv;
if (d == pv->d) found = true;
else if (d < pv->d) pv =pv->left;
else pv = pv->right;}
if (found) return pv;
здесь путем сравнения с предыдущим ищем пустой лист, если не пусто, то отправляемся в левый при меньшем, чем корень. В противном случае в правый.
C++
1
2
3
4
5
6
7
8
Node *pnew = new Node;
pnew->d = d;
pnew->left = 0;
pnew->right = 0;
if (d < prev->d)
prev->left == pnew;
else
prev->right = pnew;
тут грубо говоря делаем так, что бы указатель правый или левый найденного элемента указывал(простите за тавтологию) на созданный pnew, который там же заполняется.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.09.2013, 22:30
Ответы с готовыми решениями:

Бинарное дерево
Задание на картинке, помогите, пожалуйста, создать функцию поиска величины наибольшего элемента дерева

Бинарное дерево
Доброго времени суток. Есть задание: Описать класс, что реализует бинарное дерево, обладающие возможностью добавление новых элементов,...

Бинарное дерево
Всем привет!Помогите исправить ошибки #include &lt;iostream.h&gt; #include &lt;iomanip.h&gt; #include &lt;stdlib.h&gt; #include...

5
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33372 / 21498 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
24.09.2013, 23:46
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
Node *search_insert(Node *root, int d)
{
    Node *pv = root, *prev; // Естественно, тут запятая...
    bool found = false;
    while (pv && !found)
    {
        prev = pv;
        if (d == pv->d) found = true;
        else if (d < pv->d)
            pv = pv->left;
        else
            pv = pv->right;
    }
    if (found)
        return pv;
    Node *pnew = new Node;
    pnew->d = d;
    pnew->left = 0;
    pnew->right = 0;
    if (d < prev->d)
        prev->left = pnew; // А вот тут - присваивание, а не сравнение !!!
    else
        prev->right = pnew;
    return pnew;
}
1
43 / 37 / 17
Регистрация: 11.11.2009
Сообщений: 246
25.09.2013, 00:11  [ТС]
Спасибо, зря я на Павловскую грешил, у нее все правильно записано, это я невнимательно переписал.
Можете еще объяснить, что в этой строчке Node *pv = root, *prev; происходит и зачем? Остальное вроде понял.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33372 / 21498 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
25.09.2013, 00:12
В этой?
C++
1
Node *pv = root, *prev;
объявляем переменную pv (тип - "указатель на Node"), и инициализируем ее значением root... Одновременно с этим объявляем также еще одну переменную типа "указатель на Node", но оставляем ее неинициализированной...
1
43 / 37 / 17
Регистрация: 11.11.2009
Сообщений: 246
25.09.2013, 07:56  [ТС]
Спасибо, понял. Что-то я не признал из-за указателей).

Добавлено через 29 минут
Есть еще несколько вопросов чисто информационных.
Удаление из бинарного древа. Преподаватель покащал, что при удаление предка, удаляем и его потомков. Но я везде вижу, что они не удаляются, а по хитрому перераспределяются на вышестоящего, ну или еще куда-то. Как будет правильно сделать первым или вторым вариантом?
И поиск по дереву. Допустим мне нужно найти элемент 7. Как найти я знаю. А что должен вывести на экран? Значение или сообщение о том, что я его нашел, нелогично выводить. Тогда что? На каком уровне он находится? Его адрес? Путь к нему корень-вправо-влево... Просто лабы у нас обгоняют лекции, потому не знаю.
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
25.09.2013, 08:38
Цитата Сообщение от Vergil Посмотреть сообщение
Преподаватель покащал, что при удаление предка, удаляем и его потомков.
лучше сделать по-преподски

Цитата Сообщение от Vergil Посмотреть сообщение
Допустим мне нужно найти элемент 7. Как найти я знаю. А что должен вывести на экран? Значение или сообщение о том, что я его нашел, нелогично выводить.
в данном случае, когда нет других информационных полей и нет заданных действий после поиска (например вставка нового узла), вполне логично просто вывести сообщение нашел или не нашел, другого не дано.
смысла выводить путь не вижу, разве что в познавательных целях.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.09.2013, 08:38
Помогаю со студенческими работами здесь

Бинарное сравнение файлов
Приветствую всех! Необходимо проверить, являются ли 2 файла копиями друг друга, то есть, равны ли побайтово эти файлы. Можно, конечно,...

Бинарное чтение\ запись
Всем добрый вечер, ребята кто умеет и сталкивался с бинарным чтением и записью помогите отладить бинарную запись этой программы я там начал...

Бинарное чтение из файла
Всем доброго времени суток. Столкнулся с проблемой чтения из файла в бинарном режиме. У меня есть исполнительный файл программы для...

Исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру
Помогите, не могу понять!( Нужно исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру. вот...

Преобразовать идеальное бинарное дерево в бинарное дерево поиска
Всем привет, я создал идельное бинарное дерево и написал к нему функции. Как мне теперь можно преобразовать его в бинарное дерево поиска?...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru