1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Число вхождений элемента E в дерево T, Описать процедуру или функцию, которая его определяет
type TED = <любой тип>; дерево =^ верхушка; верхушка = record элемент: TED; левая, правая: дерево; end; Описать процедуру или функцию, которая определяет число вхождений элемента E в дерево T.
Все что пока есть:
uses crt;
type TED = integer;
t =^ top;
top = record
e: TED;
l, r: t;
end;
begin
clrscr;
readkey;
end.
Не понимаю как делать. Нужно создать дерево (как?), заполнить его чем-то (чем? рандом или от пользователя... и как?), далее получить от пользователя элемент и посчитать сколько его есть в дереве.
Нашел в книге такой исходник:
function count(T: дерево; E: ТЭД): integer;
var S: стек;
k: integer;
begin
очистек(S);
k := 0; {число вершин с E}while T <> nildobegin{T-ссылка на очередную вершину}if T^.элем = E then k := k+l;
{переход к следующей вершине:}if T^.лев <> nilthenbegin{есть ветвь влево}if T^.прав <> nilthen встек(S,T^.прав); {правую ветвь, если есть, - в стек}
T:=T^.лев {идти влево}endelseif T^.прав<>nilthen T:=T^.прав {идти вправо}else{нет обоих ветвей}begin{взять ветвь из стека и идти по ней}if пустек(S) then T := nil{конец просмотра}else изстека(S,T)
endend;
count := k
end;
На самом деле задача более чем странная. Обычно дерево строится так, что содержит только разные значения ключей (если нужна возможность хранить одинаковые ключи - в структуру, описывающую узел дерева, добавляется счетчик. При добавлении очередного элемента дерево просматривается, если значение уже хранится в дереве - то счетчик этого узла увеличивается и всё). При этом задача
Цитата
Описать процедуру или функцию, которая определяет число вхождений элемента E в дерево T.
теряет смысл. Если счетчика нет - то достаточно просмотреть дерево, и проверить, есть там искомый элемент, или нет.
Обычно дерево строится так, что содержит только разные значения ключей (если нужна возможность хранить одинаковые ключи - в структуру, описывающую узел дерева, добавляется счетчик. При добавлении очередного элемента дерево просматривается, если значение уже хранится в дереве - то счетчик этого узла увеличивается и всё).
Ключи могут быть одинаковыми и они могут повторяться
Мой новый, рабочий код:
uses crt;
type TED = integer;
tree =^ top;
top = record
e: TED;
l, r: tree;
end;
var e, n, i, r: integer;
t: tree;
procedure insert(var t: tree; e: integer);
beginif t = nilthenbegin
new(t);
t^.e := e;
t^.l := nil;
t^.r := nilendelseif random(2) = 1then insert(t^.l,e) else insert(t^.r,e)
end;
procedure show(var t: tree; h: integer);
beginif t <> nilthenbegin
show(t^.r,h+1);
write('--':(h-1)*4+6);
writeln(t^.e);
show(t^.l,h+1)
endend;
function count(t: tree; x: integer): integer;
var n: integer;
begin
n := 0;
if t <> nilthenbeginif t^.e = x then inc(n);
n := n + count(t^.l,x);
n := n + count(t^.r,x)
end;
count := n
end;
procedure remove(var t: tree);
beginif t <> nilthenbeginif t^.r <> nilthen remove(t^.r);
if t^.l <> nilthen remove(t^.l);
dispose(t)
endend;
begin
clrscr;
write('Количество узлов дерева: ');
readln(n);
randomize;
for i := 1to n dobegin
r := random(100);
insert(t,r)
end;
writeln('Дерево:');
show(t,1);
write('Искомый элемент: ');
readln(e);
writeln('Количество вхождений: ',count(t,e));
remove(t);
readkey
end.
Добавлено через 4 мин. Все хорошо, но приказали переделать ввод элементов и рисование полученного дерева. Как-то так:
procedure dobavl(var a:derevo;y:integer);
var k,kk: integer;
begin
write('Элемент: ');
readln(k);
if a=nilthenbegin new(a);a^.l:=nil;a^.r:=nil;a^.d[l]:=k;a^.d[2]:=y; end;
write('Есть левая ветка? 1 - да, 2 - нет');
read(kk);
if kk=l thenbegin inc(yl);dobavl(a^.l,yl);end;
write('Есть правая ветка? 1 - да, 2 - нет');
read(kk);
if kk=l thenbegin inc(yr);dobavl(a^.r,yr);end;
end;
Это я нашел в чужой работе. Что на это скажешь?
Добавлено через 3 мин. Нашел здесь твою функцию рисования дерева в графическом режиме. Ты не мог бы ее прикрутить к моей программе? Или объясни где и как правильно инициализировать графику, чтоб она работала. Или может у тебя есть своя программа, где она используется, выложи пожалуйста код.
Бред. Но если условие стоит так, что в дереве могут быть одинаковые ключи и они могут повторяться (хотя тогда совершенно непонятно, на кой черт кому-нибудь понадобится такое дерево? Поиск в нем будет неэффективным, ибо узлы разбросаны бессистемно, зачем его использовать?), то можно и так...
Цитата(AlexSun @ 1.12.2011 15:22)
Или объясни где и как правильно инициализировать графику, чтоб она работала. Или может у тебя есть своя программа, где она используется, выложи пожалуйста код.
А нету аналогичной процедуры, без использования графики? Или как ее написать, чтоб корень дерева был в центре строки, а ветки и листья ниже его? Аналогично моей процедуре show(), только чтоб выводилось не слева на право, а сверху вниз. Никак не придумаю.