Помогите пожалуйста, ничего не понимаю..... Написать программу, которая создаёт бинарное дерево, каждый элемент которого символ. Напечатать все элементы дерева. Выбрать и напечатать элементы, которые являются листами дерева. Определить есть ли среди листьев заданный символ....
volvo
27.10.2009 14:02
Что так уж СОВСЕМ ничего не понимаешь? Что такое бинарное дерево, знаешь? Как его обойти - знаешь? Что такое "лист" - знаешь? Что-то делать хотя бы пытался?
P.S. У меня на сайте было все, что нужно для работы с бинарными деревьями, зайди, почитай...
serega204
30.10.2009 20:22
определения всего этого знаю...но как делать не знаю....дай ссылочку плиз
я тебе кину сюда фрагмент кода....допишешь...я дальше совсем не знаю как
Добавлено через 1 мин. ???
volvo
7.11.2009 19:43
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);