С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
8 / 8 / 7
Регистрация: 14.10.2012
Сообщений: 179
1

Обход в бинарном дереве

22.12.2012, 14:52. Показов 779. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Есть задача создать свое генеалогическое дерево. К счастью, у нас в методичке указаны все процедуры и функции для него, но я напоролся на такую проблему, что программа вылетает при любом из трех видов обходов (Префиксным, Инфиксным или Суффиксным). Причем вылетает именно на строке вывода содержимого на экран.
Помогите, пожалуйста, разобраться, где ошибка!

Delphi
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
program Project1;
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
type
 tree=^node;
 node=record
    info:String;
    lint,rint: tree;
    end; 
 
function NewD (info: string): Tree; //создание нового узла
var P: tree;
begin
  New(p);
  P^.info := info;
  P^.lint := NIL;
  P^.rint := NIL;
  NewD := P;
end;
 
procedure SetLeft (P: tree; x: string); // левый "сын"
begin
  p^.lint := NewD(x);
end;
 
procedure SetRight (P: tree; x: string); // правый "сын"
begin
  p^.rint:= NewD(x);
end;
 
procedure PrefixObhod (P: tree);
begin
  if (P<>NIL) then
  begin
    writeln(P^.info);
    prefixobhod(P^.lint);
    prefixobhod(P^.rint);
  end;
end;
Procedure Title;
begin
  writeln('MY FAMILY TREE'); writeln;
end;
 
var name: string; P: tree; i,j: integer;
 
begin
  Title; i:=0; j:=0;
  write('Enter your name, it would be node: ');
  readln(Name);
  NewD(Name);
 
  repeat
  repeat
  write('Enter your mother: ');
  readln(Name);
  SetLeft(P, name);
 
  write('Enter her mother: ');
  readln(Name);
  SetLeft(P, name);
  j:=j+1;
  until j=1;
  write('Enter her father: ');
  readln(Name);
  SetRight(P, name);
  i:=i+1;
  until i=1;
 
  i:=0; j:=0;
  repeat
  repeat
  write('Enter your father: ');
  readln(Name);
  SetLeft(P, name);
 
  write('Enter his mother: ');
  readln(Name);
  SetLeft(P, name);
  j:=j+1;
  until j=1;
  write('Enter his father: ');
  readln(Name);
  SetRight(P, name);
  i:=i+1;
  until i=1;
 
  PrefixObhod (P);
  readln;
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.12.2012, 14:52
Ответы с готовыми решениями:

Алгоритм поиска в бинарном дереве
Помогите написать программу на Delphi, please

Удаление узла в бинарном дереве
Прошу помощи у знающих людей. Надо написать процедуру, удаляющую заданный с клавиатуры узел в...

Бинарное дерево в бинарном дереве: обход
Есть шаблонный класс бинарного дерева, описанный ниже. Все методы рабочие. template &lt;class T&gt;...

Совершить в бинарном дереве обход Правый - Корень - Левый
Нужно совершить обход Правый корень левый в бинарном дереве. #include &quot;stdafx.h&quot; #include...

4
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32992 / 21298 / 8180
Регистрация: 22.10.2011
Сообщений: 36,593
Записей в блоге: 8
22.12.2012, 15:59 2
Dreiser, ну смотри:
Delphi
1
2
3
4
5
6
7
8
9
10
  Title; i:=0; j:=0;
  write('Enter your name, it would be node: ');
  readln(Name);
  NewD(Name); // Здесь ты записал значение в P
 
  repeat
  repeat
  write('Enter your mother: ');
  readln(Name);
  SetLeft(P, name); // И его хочешь передавать в SetLeft?
Но ведь глобальная P не инициализирована, и компилятор тебя предупредил об этом. В процедуре NewD инициализировалась ЛОКАЛЬНАЯ переменная P, которая ничего общего с глобальной не имеет, и при попытке обратиться внутри SetLeftP к значению p^.rint (при P = nil), закономерно происходит вылет: разыменование нулевого указателя.

Хотя бы
Delphi
1
P := NewD(Name);
нужно сделать...
1
8 / 8 / 7
Регистрация: 14.10.2012
Сообщений: 179
22.12.2012, 16:07  [ТС] 3
Цитата Сообщение от UI Посмотреть сообщение
Dreiser, ну смотри:
Delphi
1
2
3
4
5
6
7
8
9
10
  Title; i:=0; j:=0;
  write('Enter your name, it would be node: ');
  readln(Name);
  NewD(Name); // Здесь ты записал значение в P
 
  repeat
  repeat
  write('Enter your mother: ');
  readln(Name);
  SetLeft(P, name); // И его хочешь передавать в SetLeft?
Но ведь глобальная P не инициализирована, и компилятор тебя предупредил об этом. В процедуре NewD инициализировалась ЛОКАЛЬНАЯ переменная P, которая ничего общего с глобальной не имеет, и при попытке обратиться внутри SetLeftP к значению p^.rint (при P = nil), закономерно происходит вылет: разыменование нулевого указателя.

Хотя бы
Delphi
1
P := NewD(Name);
нужно сделать...
О, спасибо!) хотя бы что-то выводит) правда совсем неправильно)
Показывает только меня и последних двух введенных людей... А вот если я ввел, допустим, своего отца, он же становится новым узлом, а новая запись уже пойдет от него. Как можно вернуться обратно ко "мне", чтобы ввести мать и она была на одном уровне с отцом?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32992 / 21298 / 8180
Регистрация: 22.10.2011
Сообщений: 36,593
Записей в блоге: 8
22.12.2012, 16:46 4
Dreiser, дерево заполняется вот так:

Delphi
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
function CreateTree(s : string) : tree;
var
   name : string;
   p : tree;
begin
   write(s + ': '); 
   readln(name); // Если хочешь завершить ветвь - вводи пустую строку...
   if name <> '' then
   begin
      new(p);
      p^.info := name;
      p^.lint := CreateTree(name + '''s mother');
      p^.rint := CreateTree(name + '''s father');
   end
   else p := nil;
 
   result := p;
end;
 
// тут реализации PrefixObhod и Title
 
var 
  P: tree;
 
begin
  Title;
  p := CreateTree('Enter your name');
 
  PrefixObhod (P); // Поправь только эту процедуру, чтобы она отображала отступы хотя бы
  readln;
end.
, и не забывай удалять дерево по окончании работы...
1
8 / 8 / 7
Регистрация: 14.10.2012
Сообщений: 179
22.12.2012, 17:01  [ТС] 5
Цитата Сообщение от UI Посмотреть сообщение
Dreiser, дерево заполняется вот так:

Delphi
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
function CreateTree(s : string) : tree;
var
   name : string;
   p : tree;
begin
   write(s + ': '); 
   readln(name); // Если хочешь завершить ветвь - вводи пустую строку...
   if name <> '' then
   begin
      new(p);
      p^.info := name;
      p^.lint := CreateTree(name + '''s mother');
      p^.rint := CreateTree(name + '''s father');
   end
   else p := nil;
 
   result := p;
end;
 
// тут реализации PrefixObhod и Title
 
var 
  P: tree;
 
begin
  Title;
  p := CreateTree('Enter your name');
 
  PrefixObhod (P); // Поправь только эту процедуру, чтобы она отображала отступы хотя бы
  readln;
end.
, и не забывай удалять дерево по окончании работы...
Каково отличие между программистом и волшебником? Программист не носит колпака со звездочками!
Спасибо, попробую теперь сделать вывод похожий на дерево и вставить остальные функции. Спасибо Вам!
0
22.12.2012, 17:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.12.2012, 17:01
Помогаю со студенческими работами здесь

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

Постфиксный обход(в глубину, сверху-вниз) и удаление в двоичном бинарном дереве
Здравствуйте! Мне срочно нужна помощь... Мне нужно сделать удаление в двоичном дереве поиска и...

Поиск в Бинарном Дереве!
Задано бинарное дерево. Определить, есть ли в этом дереве хотя бы два одинаковых элемента....

Поиск в бинарном дереве
Привет всем! Нужно написать код, с которым в бинарном дереве можно найти заданное пользователем...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru