Помогите по паскалю

engineer 30.05.2004 - 07:40 | Задача: Найдите число узлов на К-м уровне двоичного дерева(корень дерева - узел первого уровня). Уже 2 дня решаю - не получается. Знаю только паскаль, учу его не так долго, поэтому объясняйте, пожалуйста, по-подробнее. Спасибо.
Bronya 1 - 30.05.2004 - 10:07 | ИМХО достаточно сложная задачка для новичка! Вот что нужно сделать. Плохо помню pascal, так что простите, если что не так... скорее помню Дельфи object-pascal... 1 ) Определить класс узла у которого должны быть, например, свой номер, номер уровня и 2 указателя на классы такого же типа. 2 ) Определить в классе процедуру добавления узлов к дереву, чтобы построить дерево и уже потом считать колво узлов. В процедуре должно быть указано: что добавляем ( т.е. указатель на новый добавляемый узел ), номер узла к которому будем добавлять и, например, булевский флаг - для определения левым или правым потомком будет новый узел. 3 ) Определить в классе метод обхода дерева Хорошо использовать паттерн Посетитель для решения этой задачи... Как для добавления нового узла, так и для счетчика. Посетитель передается от узла к узлу дерева, начиная с первого узла вниз, и каждый узел вызывает его процедуру, например, Count, передавая в ней указатель на себя. Процедура посетителя Count проверяет, если вызвавший ее узел имеет нужный К-номер, то увеличивает счетчик своего класса. Таким образом получаем в результате в классе посетителя искомое колво узлов на нужном уровне!
Еще один 2 - 30.05.2004 - 13:00 | Паскалисты не думают обьектами :) Как у тебя хранится дерево, в динамической памяти или в массиве? Всегда использую такой вариант: type tree=^node; node=record key:Tkeytype;{данные в вершине дерева типа Tkeytype (integer,real...)} left,right:tree;{указатели на левое и правое поддерево} end; function count(t:tree, x:byte):integer; {t-указатель на поддерево, x-уровень вершины текущего поддерева} begin if t=nil then count:=0 else begin if x=k then count:=1 else count:=count(t^.left,x+1)+count(t^.right,x+1); end; end; ... begin rezult:=count(t,1); {в rezult хранится ответ} end. {если непонятна рекурсия, по прочитай в книгах про поиск в ширину - им тоже можно решать, только программа будут подлиннее и надо реализовывать очередь} {Здесь фактически реализован поиск в глубину с отсечением ненужных уровней}
Naffy 3 - 31.05.2004 - 02:25 | Ребята, подскажите, где найти теорию по гирляндо-висюлечным структурам в Паскале:(
silly sad 4 - 31.05.2004 - 09:19 | ответ = 2^(К-1) - програмисты мля
Гоша 5 - 31.05.2004 - 09:37 | :))))))))) такое чувство, что программисты математику проходят. причем мимо:)
ПМ 6 - 31.05.2004 - 10:37 | здесь наверно имеется в виду, что у узла не обязательно два потомка В этом случае челесообразно начинать сверху. Мой вариант: 1. Создаем стэк и добавляем в него указатель на корень дерева. Переменная kol=0 2. Создаем временный стэк и добавляем в него потомков (если есть) узлов основного стэка. Увеличиваем kol на 1. Временный стэк делаем основным 3. Выполняем пункт два пока kol не достигнет нужной величины, либо стэк не окажется пустым Если динамику не любишь, то стэк можно сделать на основе массива
ПМ 7 - 31.05.2004 - 10:38 | по сути та же рекурсия, но новичку должно быть более понятно
ПМ 8 - 31.05.2004 - 10:40 | Опять не все написал :))) 4. Размер стэка == числу узлов k-го уровня
asn 9 - 31.05.2004 - 10:41 | 2 silly sad, читаем внимательно условие задачи: >>Найдите число узлов на К-м уровне двоичного дерева... ... Где здесь написано, что дерево полное? Так что, в общем случае это лишь верхняя оценка. Т.е. Ответ <=2^(K-1).
Еще один 10 - 31.05.2004 - 12:51 | Если размер памяти не критичен, то можно хранить дерево в массиве: a[1]-корень a[i]-какая-то вершина a[2*i]-левый сын a[2*i+1]-правый сын Тогда задача решается очень просто: g:=2^(k-1); {как нибудь в цикле считаем g} rez:=0; {результат} for i:=g to 2*g-1 do if a[i]<>nil then inc(rez); {в rez хранится ответ}
engineer 11 - 01.06.2004 - 04:32 | Всем спасибо. С вашей помощью решил.

>>