Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
KobaEugeneA
5 / 5 / 0
Регистрация: 16.01.2011
Сообщений: 166
#1

Ошибка в методе обрабатывающем бинарное дерево - C++

06.04.2014, 17:12. Просмотров 176. Ответов 2
Метки нет (Все метки)

Есть метод обрабатывающий бинарное дерево и состовляющий двумерный массив указателей на листья, так что в первой строке - указатель на root, во второй - листья второго уровня и так далее. Вот сам метод:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void view_alternative(tree* root){
  tree* b[50][50];
  for(int i = 0; i < 50; i++)
    for(int j = 0; j < 50; j++)
      b[i][j] = NULL;
  int n = 0, m = 1, m1;
  b[0][0] = root;
  while(m != 0){
    m1 = m;
    m = 0;
    for(int i = 0; i < m1; i++){
      if(b[n][i] -> left != NULL){
    b[n + 1][m] = b[n][i] -> left;
    m++;
      }
      if(b[n][i] -> right != NULL){
    b[n + 1][m] = b[n][i] -> right;
    m++;
      }
      n++;
    }
  }
}
Почти при любых раскладах выдаёт: Segmentation fault (core dumped)
В чём ошибка может быть? Вот программа составляющая дерево, но она точно работает правильно:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <stdio.h>
struct tree{int a; tree* left; tree* right;};
using namespace std;
tree* find_place(tree*, int);
void view(tree*, int);
void view_alternative(tree*);
main(){
  int n;
  tree* root = new tree;
  cin >> n;
  int* a = new int[n];
  for(int i = 0; i < n; i++)
    cin >> a[i];
  root -> a = a[0];
  root -> left = NULL;
  root -> right = NULL;
  tree* eL;
  for(int i = 1; i < n; i++){
    eL = find_place(root, a[i]);
    eL -> a = a[i];
    eL -> left = NULL;
    eL -> right = NULL;
  }
  view_alternative(root);
}
tree* find_place(tree *root, int a){
  if(root -> a > a){
    if(root -> left == NULL){
      root -> left = new tree;
      return root -> left;
    }
    else
      return find_place(root -> left, a);
  }
  else{
    if(root -> right == NULL){
      root -> right = new tree;
      return root -> right;
    }
   else
     return find_place(root -> right, a);
  }
}


Добавлено через 1 час 56 минут
Сколько не смотрю, вообще не могу понять в чем ошибка то.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2014, 17:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка в методе обрабатывающем бинарное дерево (C++):

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

Бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой - C++
Дано бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой.

Бинарное дерево - C++
Не получается написать функцию для вывода дерева на экран. Работает она как-то не правильно. Помогите, пожалуйста, срочно. ВОт часть кода: ...

Бинарное дерево - C++
Друзья, помогите реализовать задачу в виде бинарного дерева: Оператор мобильной связи организовал базу данных абонентов,...

Бинарное дерево - C++
Написать программу для создания, на основе конструктора,дерева из объектов двух типов. Объекты первого типа ссылаются на два объекта....

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

2
zss
Модератор
Эксперт С++
6537 / 6099 / 2009
Регистрация: 18.12.2011
Сообщений: 15,867
Завершенные тесты: 1
06.04.2014, 17:30 #2
Цитата Сообщение от KobaEugeneA Посмотреть сообщение
выдаёт: Segmentation fault
У меня не выдает.
Перед выходом из view_alternative(tree* root)
массив b содержит
b[0][0]->root.right0->root.right1->root.right2->root.right3....
b[1][0]->root.right1->root.right2->root.right3....
b[2][0]->root.right2->root.right3....
b[3][0]->root.right3....
Остальные указатели нулевые.
Так и задумано?
Кстати, Вы его из функции не возвращаете.
Тогда зачем все это?
0
KobaEugeneA
5 / 5 / 0
Регистрация: 16.01.2011
Сообщений: 166
06.04.2014, 17:38  [ТС] #3
Я на g++ компилировал.
А почему там нету указателей на left?
Не возвращает, там так и задумано, я дорабатывать ещё буду.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2014, 17:38
Привет! Вот еще темы с ответами:

Бинарное дерево - C++
Только начал изучать тему &quot;деревья&quot;. Подскажите в чем ошибка)#include &lt;iostream&gt; using namespace std; struct Node{ int...

Бинарное дерево - C++
Здравствуйте, Корень создаёться вот так TREE *root=NULL; непонятно почему функия добовления использует указатель на указатель ...

Бинарное дерево - C++
Всем доброго времени суток! Задача такая: Реализовать бинарное дерево в программе предусматривающей следующие функции: добавление узла,...

Дерево бинарное - C++
Интересует вопрос, при добавлении нового элемента куда я его должен буду помещать, на какую ветку. Допустим есть дерево с корнем 5 и...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru