Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
03.10.2010, 01:56     Проблемы с выводом бинарного дерева #1
Вот, пытался сделать лабу. Проблема с выводом. Извините за код, знаю что он кривой, сделайте замечания!!!

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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2010, 01:56     Проблемы с выводом бинарного дерева
Посмотрите здесь:

Прошивка бинарного дерева на С++ C++
Построение бинарного дерева C++
C++ Обход бинарного дерева
C++ Шаблон бинарного дерева
C++ Вывод бинарного дерева
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.10.2010, 07:53     Проблемы с выводом бинарного дерева #2
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, то разыменовывать первое и взять в нём левый узел
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
03.10.2010, 22:17  [ТС]     Проблемы с выводом бинарного дерева #3
Цитата Сообщение от accept Посмотреть сообщение
это как, если деревья равны NULL, то разыменовывать первое и взять в нём левый узел
если деревья пустые, или не пустые, то проверяем равно ли правое поддерево первого дерева левому поддерева второго дерева.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
04.10.2010, 01:29     Проблемы с выводом бинарного дерева #4
ну, как ты проверишь правое поддерево, если дерева нет
если дерева нет, то у него нельзя рассмотреть поддерево
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
04.10.2010, 11:43  [ТС]     Проблемы с выводом бинарного дерева #5
А как тогда быть?
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
04.10.2010, 13:31     Проблемы с выводом бинарного дерева #6
Два бинарных дерева зеркально подобны, если либо оба они пусты
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))
        ;
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
05.10.2010, 22:18  [ТС]     Проблемы с выводом бинарного дерева #7
Какая библиотека для функции 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;
}
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
05.10.2010, 22:20     Проблемы с выводом бинарного дерева #8
Цитата Сообщение от MILAN Посмотреть сообщение
time_t srand(time(NULL));
Что вы хотели сказать этой строкой? Зачем нужно time_t?
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
05.10.2010, 22:24  [ТС]     Проблемы с выводом бинарного дерева #9
Ето неважно, просто я взял кусок програмы!! Строка надо для заполнения елементов дерева рандомом, смотрите выше!!! Я незнаю как правильно обратится к поддереву, вроде ошыбок нет, а ничего не выводит!!!!
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
05.10.2010, 22:24     Проблемы с выводом бинарного дерева #10
MILAN, очень важно, потому что это строка не работает.
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
05.10.2010, 22:25  [ТС]     Проблемы с выводом бинарного дерева #11
Цитата Сообщение от gooseim Посмотреть сообщение
Зачем нужно time_t?
Без него компилятор выдавал:

warning C4244: 'argument' : conversion from 'time_t' to 'unsigned int', possible loss of data
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
05.10.2010, 22:26     Проблемы с выводом бинарного дерева #12
MILAN, компилятор другое имел ввиду:
C++
1
srand((unsigned)time(NULL));
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
05.10.2010, 22:27  [ТС]     Проблемы с выводом бинарного дерева #13
Спасибо, но может у вас есть какие варианты решение моей проблемы по поводу вывода?
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
05.10.2010, 22:29     Проблемы с выводом бинарного дерева #14
Прежде, чем что-то делать с указателем на объект, этот объект нужно создать. А вы этого категорически не делаете. Поэтому ничего и не работает.
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
05.10.2010, 22:33  [ТС]     Проблемы с выводом бинарного дерева #15
Так я ведь создаю дерево, и поддерево!!!
C++
1
2
  trees tree_1=NULL;
  tree_1 = new Node;
Добавлено через 1 минуту
Если вам не трудно, приведите маленький примерчик!!!
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
05.10.2010, 22:35     Проблемы с выводом бинарного дерева #16
Цитата Сообщение от MILAN Посмотреть сообщение
tree_1->left->key=6;
А где вы здесь создаете поддерево? Вы присваиваете key неициализированному объекту.
Примерчик:
C++
1
tree_1->left=new Node;
MILAN
 Аватар для MILAN
883 / 777 / 86
Регистрация: 21.02.2009
Сообщений: 1,722
05.10.2010, 22:37  [ТС]     Проблемы с выводом бинарного дерева #17
Спасибо, теперь понял!!!!
time2die
51 / 51 / 3
Регистрация: 25.05.2010
Сообщений: 182
05.10.2010, 22:41     Проблемы с выводом бинарного дерева #18
толи я дурак, толи лыжи не едут...у вас сравнивается не всё дерево а только первая вершина...

я когда делал задачу на деревья выводил так
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, коряво но ужасно просто

весь код задания здесь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2010, 04:01     Проблемы с выводом бинарного дерева
Еще ссылки по теме:

Создание бинарного дерева C++
Что-то не то с выводом сохранённых данных из бинарного файла C++
C++ Высота бинарного дерева

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

Или воспользуйтесь поиском по форуму:
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.10.2010, 04:01     Проблемы с выводом бинарного дерева #19
Цитата Сообщение от MILAN Посмотреть сообщение
Какая библиотека для функции is_similar?
функцию is_similar нужно писать, так как в язык такие функции не встраиваются
то, что ты делал через == никуда не годится, потому что оно сравнивает указатели (адресы)
в действительности оно проверяет, равны ли адресы двух разных узлов

а is_similar должна каждый узел левого дерева сравнивать с соответствующим узлом правого дерева, причем брать содержимое узлов, а не адресы
Yandex
Объявления
06.10.2010, 04:01     Проблемы с выводом бинарного дерева
Ответ Создать тему
Опции темы

Текущее время: 01:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru