IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> бинарное дерево, нужна помощь
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: serega

Репутация: -  0  +


Помогите пожалуйста, ничего не понимаю.....
Написать программу, которая создаёт бинарное дерево, каждый элемент которого символ. Напечатать все элементы дерева. Выбрать и напечатать элементы, которые являются листами дерева. Определить есть ли среди листьев заданный символ....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Что так уж СОВСЕМ ничего не понимаешь? Что такое бинарное дерево, знаешь? Как его обойти - знаешь? Что такое "лист" - знаешь? Что-то делать хотя бы пытался?

P.S. У меня на сайте было все, что нужно для работы с бинарными деревьями, зайди, почитай...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: serega

Репутация: -  0  +


определения всего этого знаю...но как делать не знаю....дай ссылочку плиз
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Здесь
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: serega

Репутация: -  0  +


я тебе кину сюда фрагмент кода....допишешь...я дальше совсем не знаю как

Добавлено через 1 мин.
???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






serega204, ты не спрашивай, смогу я тебе помочь, не смогу. Я на форуме не один. Кто-нибудь обязательно поможет. А в приват мне задавать вопросы по программированию - практически бессмыссленно, я на них не отвечаю, для этого есть форум. По поводу твоего вопроса:

нет, твой код работает неправильно. Он вылетает при печати дерева, потому что надо сравнивать не так:
Цитата
Procedure PrintTree(tree : Node);
Begin
Write(tree^.info, ' ');
If tree^.left = Nil then PrintTree(tree^.left);
If tree^.right = Nil then PrintTree(tree^.right)
End;
, а как минимум - вот так:
Procedure PrintTree(tree : Node);
Begin
Write(tree^.info, ' ');
If tree^.left <> Nil then PrintTree(tree^.left);
If tree^.right <> Nil then PrintTree(tree^.right)
End;
, т.е., не пытаться переходить по нулевому указателю, а предотвращать это. Вот программа, реализующая твое задание (я не стал менять твою процедуру NewTree, и код, заполняющий дерево, поменял только то, что не работало):
Program LR_3;
Type
Node = ^Bder;
Bder = record
info : char;
left, right : Node;
end;

Var
tree : Node;
i, N : Integer;
info : Char;

{ Создание нового бинарного дерева }
Procedure NewTree(info : Char; Var tree : Node);
Var P, pr, T: Node;
Begin
New(T);
T^.info := info;
T^.left := Nil;
T^.Right := Nil;
P := tree; Pr := Nil;
While p <> Nil do
Begin
Pr := P;
If p^.info > info then P := P^.left
else P := P^.right;
End;
If tree = Nil then tree := T
else
If Pr^.info > info then Pr^.left := T
else Pr^.right := T;
End;

{ Процедура обхода дерева }
Procedure PrintTree(level: integer; tree : Node);
Begin
If tree <> nil then
with tree^ do
begin
Writeln('':2*level, info);
PrintTree(level + 1, Left);
PrintTree(level + 1, Right);
end;
End;

{
Печатаем листья, одновременно подсичтывая, сколько из них
равны Ch
}
procedure PrintLeafs(ch: char; Tree: node; var count: integer);
begin
if tree <> nil then
begin
PrintLeafs(ch, tree^.Left, count);
if (tree^.Left = nil) and (tree^.Right = nil) then
begin
write(tree^.info:2);
if ch = tree^.info then inc(count);
end;
PrintLeafs(ch, tree^.Right, count);
end
end;

{ Удаление дерева }
Procedure DeleteTree(P : Node);
Begin
If P^.left <> Nil then DeleteTree(P^.left);
If P^.right <> Nil then DeleteTree(p^.right);
Dispose(P);
P := Nil;
End;

var
counter: integer;

{ Основная программа }
Begin
Write('Введите количество элементов дерева: '); Readln(N);
tree := Nil;
For i := 1 to N do
Begin
Write(i, ' элемент = '); Readln(info);
NewTree(info, tree);
End;

If tree = nil then Writeln('Пустое дерево')
else
begin
Writeln('Обход дерева:');
PrintTree(0, tree);

write('Введите символ (для поиска в листьях): '); readln(info);

writeln('Листья:');
counter := 0;
PrintLeafs(info, tree, counter);
writeln;

writeln('Среди листьев найдено ', Сounter, ', равных заданному символу');

DeleteTree(tree);
end;

Readln;
End.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: serega

Репутация: -  0  +


благодарю...очень сильно, но там возникает ошибка переполнения стека...и что такое inc?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Цитата
но там возникает ошибка переполнения стека...и что такое inc?
Если у тебя возникает какая-то ошибка - то исправляй ее... У меня (а я ВСЕ программы тестирую перед тем, как выложить) ничего не возникает.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 30
Пол: Мужской
Реальное имя: serega

Репутация: -  0  +


Спасибо огромнейшее Volvo.....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 21:09
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name