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

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

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

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


Новичок
*

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

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


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


Гость






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

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


Новичок
*

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

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


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


Гость






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


Новичок
*

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

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


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

Добавлено через 1 мин.
???
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.11.2009 15:43
Сообщение #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.
 К началу страницы 
+ Ответить 
serega204
сообщение 8.11.2009 23:54
Сообщение #7


Новичок
*

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

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


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


Гость






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


Новичок
*

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

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


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

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

 

- Текстовая версия 8.10.2025 4:35
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"