Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для MILAN
899 / 793 / 186
Регистрация: 21.02.2009
Сообщений: 1,722

Проблемы с выводом бинарного дерева

03.10.2010, 01:56. Показов 1518. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот, пытался сделать лабу. Проблема с выводом. Извините за код, знаю что он кривой, сделайте замечания!!!

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
/*
Два бинарных дерева зеркально подобны, если либо оба они пусты, 
либо оба непустые, и при этом левое поддерево одного из них подобно 
правом поддерево другого и наоборот. Определить, два дерева зеркально подобными
*/
#include <iostream>
#include <ctime>
 
using std::cout;
using std::cin;
using std::endl;
 
struct Node
 {
   int key;
   Node *left;
   Node *right;
 };
typedef Node* trees;
trees AddNode(trees& t, int n)
{
   if (t == NULL)  
   { 
       t = new Node; 
       t->left = NULL; 
       t->right = NULL; 
       t->key = n; 
  }
   else             
   { if (n >=t->key) 
         AddNode(t->right, n);  
     if (n <  t->key) 
         AddNode(t->left, n);   
    }
   return t;
}
 
int main()
{ int i=1;
  srand(time(NULL)); 
  setlocale( LC_ALL,"Russian" );
  trees tree_1=NULL, tree_2=NULL;
  for(;i<=3;i++)
  {
      AddNode(tree_1,rand()%-4+4);
      AddNode(tree_2,rand()%-4+4);
  }
   if ((tree_1==NULL&&tree_2==NULL)||(tree_1!=NULL&&tree_2!=NULL))
   {
       if ((tree_1->left==tree_2->right)||(tree_1->right==tree_2->left))
          {
              cout<<"Дерева дзеркально подiбнi!!!"<<endl;
              cout<<"tree_1 -> "<<tree_1->key<<"  "<<tree_1->left->key<<"  "<<tree_1->right->key<<endl;
              cout<<"tree_2 -> "<<tree_2->key<<"  "<<tree_2->left->key<<"  "<<tree_2->right->key;
         }
       else 
              cout<<"Дерева не дзеркально подiбнi!!!"<<endl;
              cout<<"tree_1 -> "<<tree_1->key<<"  "<<tree_1->left->key<<"  "<<tree_1->right->key<<endl;
              cout<<"tree_2 -> "<<tree_2->key<<"  "<<tree_2->left->key<<"  "<<tree_2->right->key;
   }
        
   system("pause");
   return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.10.2010, 01:56
Ответы с готовыми решениями:

Запись бинарного дерева в файл и восстановление из него этого дерева
Задача такая: есть бинарное дерево. Каждый элемент дерева содержит 3 указателя - 1 указатель на структуру с данными, 2 и 3й указатель на...

Написать шаблон бинарного дерева с функцией распечатки дерева
Не понимаю, что от меня хотят. Дано такое задание: Написать шаблон бинарного дерева с функцией распечатки дерева *(+(d,e),c) в виде...

Создание бинарного дерева из бинарного файла
struct Bin { string name; string city; int players; int score; }; void ReadFromBin(Point*&amp; Tree) { Bin q;

18
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
03.10.2010, 07:53
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        else {
              cout << "Дерева не дзеркально подiбнi!!!" << endl;
              cout << "tree_1 -> "
                       << tree_1->key
                       << "  "
                       << tree_1->left->key
                       << "  "
                       << tree_1->right->key
                       << endl;
                       
              cout << "tree_2 -> "
                       << tree_2->key
                       << "  "
                       << tree_2->left->key
                       << "  "
                       << tree_2->right->key
                       << endl;
        }
Добавлено через 2 минуты
C++
1
2
    if ((tree_1==NULL&&tree_2==NULL)||(tree_1!=NULL&&tree_2!=NULL))
        if ((tree_1->left==tree_2->right)||(tree_1->right==tree_2->left))
это как, если деревья равны NULL, то разыменовывать первое и взять в нём левый узел
0
 Аватар для MILAN
899 / 793 / 186
Регистрация: 21.02.2009
Сообщений: 1,722
03.10.2010, 22:17  [ТС]
Цитата Сообщение от accept Посмотреть сообщение
это как, если деревья равны NULL, то разыменовывать первое и взять в нём левый узел
если деревья пустые, или не пустые, то проверяем равно ли правое поддерево первого дерева левому поддерева второго дерева.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
04.10.2010, 01:29
ну, как ты проверишь правое поддерево, если дерева нет
если дерева нет, то у него нельзя рассмотреть поддерево
0
 Аватар для MILAN
899 / 793 / 186
Регистрация: 21.02.2009
Сообщений: 1,722
04.10.2010, 11:43  [ТС]
А как тогда быть?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
04.10.2010, 13:31
Два бинарных дерева зеркально подобны, если либо оба они пусты
C
1
if (t1 == NULL && t2 == NULL)
либо оба непустые, и при этом левое поддерево одного из них подобно
правом поддерево другого и наоборот
C
1
2
3
4
5
6
7
    if (t1 == NULL && t2 == NULL)
        ;
    else if (t1 != NULL
          && t2 != NULL
          && is_similar(t1->left, t2->right)
          && is_similar(t1->right, t2->left))
        ;
1
 Аватар для MILAN
899 / 793 / 186
Регистрация: 21.02.2009
Сообщений: 1,722
05.10.2010, 22:18  [ТС]
Какая библиотека для функции is_similar?

Добавлено через 1 час 57 минут
Подскажыте, в чем сдесь ошыбка, голову уже 2 часа ломаю, не могу вывести поддерево?

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{ int i=1;
  time_t srand(time(NULL)); 
  setlocale( LC_ALL,"Russian" );
  trees tree_1=NULL;
  tree_1 = new Node;
  tree_1->key=5;
  tree_1->left->key=6;
  cout<<tree_1->left->key; 
  system("pause");
   return 0;
}
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
05.10.2010, 22:20
Цитата Сообщение от MILAN Посмотреть сообщение
time_t srand(time(NULL));
Что вы хотели сказать этой строкой? Зачем нужно time_t?
0
 Аватар для MILAN
899 / 793 / 186
Регистрация: 21.02.2009
Сообщений: 1,722
05.10.2010, 22:24  [ТС]
Ето неважно, просто я взял кусок програмы!! Строка надо для заполнения елементов дерева рандомом, смотрите выше!!! Я незнаю как правильно обратится к поддереву, вроде ошыбок нет, а ничего не выводит!!!!
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
05.10.2010, 22:24
MILAN, очень важно, потому что это строка не работает.
0
 Аватар для MILAN
899 / 793 / 186
Регистрация: 21.02.2009
Сообщений: 1,722
05.10.2010, 22:25  [ТС]
Цитата Сообщение от gooseim Посмотреть сообщение
Зачем нужно time_t?
Без него компилятор выдавал:

warning C4244: 'argument' : conversion from 'time_t' to 'unsigned int', possible loss of data
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
05.10.2010, 22:26
MILAN, компилятор другое имел ввиду:
C++
1
srand((unsigned)time(NULL));
1
 Аватар для MILAN
899 / 793 / 186
Регистрация: 21.02.2009
Сообщений: 1,722
05.10.2010, 22:27  [ТС]
Спасибо, но может у вас есть какие варианты решение моей проблемы по поводу вывода?
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
05.10.2010, 22:29
Прежде, чем что-то делать с указателем на объект, этот объект нужно создать. А вы этого категорически не делаете. Поэтому ничего и не работает.
0
 Аватар для MILAN
899 / 793 / 186
Регистрация: 21.02.2009
Сообщений: 1,722
05.10.2010, 22:33  [ТС]
Так я ведь создаю дерево, и поддерево!!!
C++
1
2
  trees tree_1=NULL;
  tree_1 = new Node;
Добавлено через 1 минуту
Если вам не трудно, приведите маленький примерчик!!!
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
05.10.2010, 22:35
Цитата Сообщение от MILAN Посмотреть сообщение
tree_1->left->key=6;
А где вы здесь создаете поддерево? Вы присваиваете key неициализированному объекту.
Примерчик:
C++
1
tree_1->left=new Node;
1
 Аватар для MILAN
899 / 793 / 186
Регистрация: 21.02.2009
Сообщений: 1,722
05.10.2010, 22:37  [ТС]
Спасибо, теперь понял!!!!
0
52 / 52 / 10
Регистрация: 25.05.2010
Сообщений: 182
05.10.2010, 22:41
толи я дурак, толи лыжи не едут...у вас сравнивается не всё дерево а только первая вершина...

я когда делал задачу на деревья выводил так
C++
1
2
3
4
5
6
7
8
9
void out( node * p , int k )
{
        k++ ;
        cout<<k<<":"<<p->value<<"\tx"<<p->count<<"\t"<<p->number<<"\n" ;
        if( p->right != NULL) 
                out( p->right , k ) ;
        if( p->left != NULL)
                out( p->left , k ) ;
}
где node * p это указатель на корень дерева, а k при первом вызове равно 0, коряво но ужасно просто

весь код задания здесь
1
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.10.2010, 04:01
Цитата Сообщение от MILAN Посмотреть сообщение
Какая библиотека для функции is_similar?
функцию is_similar нужно писать, так как в язык такие функции не встраиваются
то, что ты делал через == никуда не годится, потому что оно сравнивает указатели (адресы)
в действительности оно проверяет, равны ли адресы двух разных узлов

а is_similar должна каждый узел левого дерева сравнивать с соответствующим узлом правого дерева, причем брать содержимое узлов, а не адресы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.10.2010, 04:01
Помогаю со студенческими работами здесь

Построение бинарного дерева на основе не бинарного
В лабораторной работе есть такое задание: Создайте процедуру построения бинарного дерева на основе не бинарного. Объясните как вообще...

Вывод бинарного дерева на экран в виде "дерева"
основная задача: подсчет количества листьев. проблема: при просмотре хочу выводить бин. дерево, в красивом виде, возможно использование...

Считывание из бинарного файла в структуру с последующим выводом
В бинарном файле храниться инфа: Имя_пользователя дата_подключения номер Имя_пользователя дата_подключения номер и т.д. Есть...

Что-то не то с выводом сохранённых данных из бинарного файла
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; using namespace std; FILE...

Реализация бинарного дерева
Доброго времени суток, уважаемые форумчане. Возник вопрос по реализации бинарного дерева на С++, а именно с методом удаления элемента в...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru