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

 



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