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

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

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

> Деревья
Aleks
сообщение 6.09.2005 7:22
Сообщение #1


Новичок
*

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

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


Здраствуйте
Прошу помощи в решение задачи: Подсчитать число вершин на n-ом уровне непустого дерева Т (корень считать вершиной нулевого дерева)
я в этом плохо разбираюсь, но кое-что написал

Исходный код
uses crt;
type
pitem=^titem;
titem=record
data:string;
pred:pitem;
next:pitem;
end;

var
first,last:pitem;
ff:text;
ss:string;
i:integer;

procedure add(ss:string);
var
newitem:pitem;
d:string;
begin
for i:=1 to length(ss) do
begin
d:=ss[1+length(ss)-i];
new(newitem);
newitem^.data:=d;
newitem^.pred:=nil;
newitem^.next:=first;
first:=newitem;
if last=nil then last:=newitem;
end;
end;

procedure print;
begin

end;

procedure del;
var
delitem:pitem;
begin
delitem:=first;
if delitem<>nil then
begin
first:=delitem^.next;
delitem^.Pred^.Next:=delitem^.Next;
dispose(delitem);
end;
end;

begin
{ clrscr; }
writeln('--' , memavail);

assign(ff,'E:\derevo.txt');
reset(ff);
while not (eof(ff)) do
begin
readln(ff,ss);
writeln(ss);
end;
add(ss);
del;
close(ff);
writeln('--' , memavail);
readln;
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Aleks
сообщение 6.09.2005 13:02
Сообщение #2


Новичок
*

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

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


проверьте правильно сделал или нет

Исходный код
uses crt;
type
ttype=record
n:integer;
count:integer;
end;

TTree=^TNode;
TNode=Record
data:TType;
Left, Right:TTree;
end;

var
t:TTree;
ff:text;
d,ss:string;
i:integer;

procedure add(var T: TTRee; i:Integer);

procedure CreateNode(var p:TTRee; n:integer);
begin
new(p);
p^.Data.n:=n;
p^.Data.Count:=1;
p^.Left:=nil;
p^.Right:=nil;
end;

begin
if t<>nil then
with t^ do
begin
if Data.n<i then Add(Right,i)
else
if Data.n>i then Add(Left,i)
else Inc(Data.Count)
end
else
CreateNode(T,i);
end;

procedure Delete(T: TTRee);
begin
if T=nil then Exit;

delete(T^.Right);
delete(T^.left);
dispose(t);
end;


begin
writeln('--' , memavail);

assign(ff,'E:\derevo.txt');
reset(ff);
while not (eof(ff)) do
begin
readln(ff,ss);
{writeln(ss);}
end;
for i:=1 to length(ss) do
begin
d:=ss[1+length(ss)-i];
add(T,1);
end;
delete(t);
close(ff);

writeln('--' , memavail);
readln;
end.


вопрос: по процедуре add, я хотел бы понять ее действие

Код

 if t<>nil then
 with t^ do
 begin
   if Data.n<i then Add(Right,i)
   else
     if Data.n>i then Add(Left,i)
       else Inc(Data.Count)
 end
 else
   CreateNode(T,i);
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 6.09.2005 13:27
Сообщение #3


Гость






Цитата(Aleks @ 6.09.05 13:02)
вопрос: по процедуре add, я хотел бы понять ее действие
Дело в том, что бинарные деревья так устроены, что
Цитата(FAQ:Деревья)
для каждого узла выполняется правило: в левом поддереве содержатся только ключи, имеющие значения, меньшие, чем значение данного узла, а в правом поддереве содержатся только ключи, имеющие значения, большие, чем значение данного узла.

Отсюда и реализация Add:
Procedure Add(Var T: TTree; i: Integer);

Procedure CreateNode(Var p: TTree; n: Integer);
Begin { ... } End;

Begin
If T <> nil Then { если текущий корень не пустой, то ... }
With T^ Do Begin
{ ... если элемент данных > корневого }
If Data.n < i Then Add(Right, i) { то добавить его в правое поддерево }
Else { ... если элемент данных < корневого }
If Data.n > i Then Add(Left, i) { то добавить его в левое поддерево }

{
если добавляемый и корневой элемент равны,
то просто увеличить счетчик значений корневого элемента
}
Else Inc(Data.Count)
End
Else { текущий корень пуст, то есть элемент должен быть создан }
CreateNode(T, i) { тогда создаем его ... }
End;


А по поводу твоей программы - я например не понял, почему ты добавляешь только единицы в дерево... В результате ты получишь не дерево, в один только корневой элемент, значение N которого будет равно 1, а Count будет равен длине последней строки файла (ибо все остальные строки ты пропускаешь)... Смысл такой программы в чем? Что ты хотел, чтобы содержалось в дереве?

Скорее всего, тебе надо добавлять НЕ целые числа, а символы или строки, так поменяй типы там где надо...
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Aleks   Деревья   6.09.2005 7:22
klem4   Aleks, попробуй посмотреть вот тут : FAQ Динамичес...   6.09.2005 8:30
volvo   Aleks, у тебя дерево неправильно задано: оно должн...   6.09.2005 10:38
Aleks   спасибо klem4 за ссылку, полезная информация   6.09.2005 11:39
Aleks   проверьте правильно сделал или нет uses crt; type...   6.09.2005 13:02
volvo   Дело в том, что бинарные деревья так устроены, что...   6.09.2005 13:27
Aleks   есть файл derevo.txt , с которого считываются данн...   6.09.2005 14:26
volvo   Ах, вот оно что !!! :) Тогда тебе дума...   6.09.2005 14:59
volvo   Кстати, если задача не состоит в том, чтобы дерево...   6.09.2005 15:20
Aleks   volvo , я тебя понял, но цель работы Освоить основ...   7.09.2005 4:33
Aleks   Подскажите пожалуйста в решении задачи   7.09.2005 11:53
volvo   Минут через 20 выложу решение ;)   7.09.2005 13:03
volvo   Вот, что получилось: (рекурсивный разбор строки с ...   7.09.2005 14:52
Aleks   я вставил функцию PrintTreeGraph volvo ЭТО СУПЕР   8.09.2005 6:11
Aleks   volvo Помоги :molitva: я уже голову сломал, не...   9.09.2005 6:09
volvo   Ну, если вот эта процедура не устраивает, то приво...   9.09.2005 9:30
Aleks   где level - искомый уровень if (root<>nil)...   9.09.2005 10:35
volvo   Значит, ты неправильно вызываешь эту процедуру. Я ...   9.09.2005 10:44
Aleks   volvo я прикрепил файл (изображение дерева) я его ...   9.09.2005 11:38
volvo   Я же тебе говорю, что то, у чего ЕСТЬ хотя бы один...   9.09.2005 12:49
Aleks   Извини что тупил, теперь дошло Все работает просто...   9.09.2005 13:22


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

 



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