Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2008, 18:52   #1
Fuaran8989
 
Регистрация: 14.04.2008
Сообщений: 6
По умолчанию Деревья. макс высота

нужно вывести на экран поддерево с максимальной высотой от корня. Хелп плз!!
Fuaran8989 вне форума Ответить с цитированием
Старый 26.05.2008, 18:16   #2
Fuaran8989
 
Регистрация: 14.04.2008
Сообщений: 6
По умолчанию

Хелп плз очень нужно
Fuaran8989 вне форума Ответить с цитированием
Старый 26.05.2008, 20:59   #3
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

У вас два пути.
Первый: выкладываете наработки и вместе исправляем/дополняем.
Второй: ничего не выкладываете. Вашу тему перемещают в раздел Фриланс, а там вам указывают цену за работу и ваше дело соглашаться или нет.
MaTBeu вне форума Ответить с цитированием
Старый 26.05.2008, 21:59   #4
Fuaran8989
 
Регистрация: 14.04.2008
Сообщений: 6
По умолчанию

вот есть прога но там много лишнего..

uses crt;
type
tree=^node;
node=record
key: char;
left, right: tree;
end;
var
n: integer;
root,p: tree;
ch, x: char;


function createtree(n:integer): tree;
var
newnode: tree;
nl, nr: integer;
x: char;
begin
if n=0 then createtree:=nil
else
begin
nl:=n div 2;
nr:=n-nl-1;
write('vvedite znachenie');
readln(x);
new(newnode);
with newnode^ do
begin
key:=x;
left:=createtree(nl);
right:=createtree(nr);
end;
createtree:=newnode;
end;
end;

procedure printtree(t:tree; n:integer);
var i: integer;
begin
if t<>nil then
with t^ do
begin
printtree(right, n+1);
write('':4*n);
writeln(key);
printtree(left,n+1);
end;
end;

function countit (t: tree; l: shortint): shortint;
var hl, hr: shortint;
begin
if t<>nil then
begin
inc(l);
hl:=countit(t^.left,l);
hr:=countit(t^.right,l);
countit:= l+hl+hr;
end
else countit:=0;
{ write(t^.key,l,' ');}
end;


function nodescount(t: tree): word;
begin
if t<>nil then
nodescount:=1+nodescount(t^.left)+n odescount(t^.right)
else
nodescount:=0;
end;
{
function getnode (t: tree; side: char): tree;
var p:tree;
begin
if t<>nil then
begin
if t^.key=ch then
begin
p:=t;
if side='r' then
p:=p^.right;
if side='l' then
p:=p^.left;
end
else
begin
getnode:=getnode(t^.left, side);
getnode:=getnode(t^.right, side);
end;
end;
getnode:=p;
end;
}
procedure getnode(t: tree; side: char);
begin
if t<>nil then
begin
if t^.key=ch then
begin
p:=t;
if side='r' then
p:=p^.right;
if side='l' then
p:=p^.left;
end;
getnode(t^.left, side);
getnode(t^.right, side);
end;
end;

procedure justdoit (t: tree);
var lengLeft, lengRight: shortint;
begin
if t<>nil then
begin
if t^.key=ch then
begin
{writeln ('dddd');
writeln( countit(t,-1) );}
lengleft:=countit(t^.left,-1);
lengright:=countit(t^.right,-1);
if lengleft>lengright then
begin
writeln('naibol''shaya dlina puti u levogo poddereva ', ch, ': ', lengleft);
getnode(root,'l');
writeln('kolichestvo uzlov:', nodescount(p));
printtree(p, 0);
end;
if lengLeft<lengRight then
begin
writeln('naibol''shaya dlina puti u pravogo poddereva ', ch, ': ', lengright);
getnode(root,'r');
writeln('kolichestvo uzlov:', nodescount(p));
printtree(p, 0);
end;
if lengLeft=lengRight then
begin
writeln('dlina puti levogo i pravogo podderev''ev ravni:',lengLeft);
getnode(root,'l');
writeln('kolichestvo uzlov v kazhdom poddereve ',ch,' ravno:', nodescount(p));

end;
end
else
begin
justdoit(t^.left);
justdoit(t^.right);
end;
end;
end;

function poisktree (t,newt: tree; ch: char): tree;
begin
if newt=nil then
begin
new(newt);
newt^.left:=nil ;
newt^.right:=nil;
newt^.key:=ch;
if ch< t^.key then t^.left:=newt
else t^.right:=newt;
poisktree:=newt;
end
else
begin
if ch<newt^.key then poisktree:=poisktree(newt, newt^.left, ch)
else poisktree:=poisktree(newt, newt^.right, ch);
end;
end;


procedure buildpoisk;
var i,j: shortint;
ch: char;
hzcho: tree;
begin
root:=nil;
repeat
write('vvedite znachenie(space-vihod) ');
readln (ch);
if ch<>' ' then
begin
if root=nil then root:=poisktree(root,root,ch)
else hzcho:=poisktree(root, root, ch);
end;
until ch=' ';
printtree(root, 0);
end;

procedure menu;
begin
clrscr;
writeln('1. ideal''no sbalansirovannoe derevo');
writeln('2. derevo poiska');
writeln('0. vihod');
readln(x);
case x of
'1' : begin
root:=nil;
write('vvdite chislo uzlov:');
readln(n);
root:=createtree(n);
writeln('sozdano derevo:') ;
printtree(root,0);
writeln('viberite vershinu:');
readln(ch);
justdoit(root);
readln;
end;
'2' : begin
root:=nil;
buildpoisk;
readln;
writeln('viberite vershinu:');
readln(ch);
justdoit(root);
readln;
end;
'0' : exit;
end;
menu;
end;

begin
menu;
end.
Fuaran8989 вне форума Ответить с цитированием
Старый 27.05.2008, 09:32   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Надеюсь, это Вам поможет:

Для узла нужно определить высоту его максимального поддерева:

Код:
function getHeight(B:Tree):integer;
var res, L : integer;
begin
   res := 0;
   if B <> nil then begin
      res := getHeight(B.left);
      L   := getHeight(B.right);
      if L > res then res := L;
      res := res+1;
   end;
   getHeight := res;
end;

// теперь собственно вывод 
// информацию узла выводим сразу.
// затем выбираем из left, rigth узел с максимальной высотой поддерева
function getMaxSubTree(B:Tree):String;
var res:String;
    L, R:integer;
begin
    res := '';
    if B <> nil then begin
       res := B.info + '-';

       L := getHeight(B.left);
       R := getHeight(B.right);
       if L >= R
       then res := res + getMaxSubTree(B.left)
       else res := res + getMaxSubTree(B.right)
    end;
    getMaxSubTree := res;
end;

writeLn( getMaxSubTree(head) );
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Высота таск бара... Altera Win Api 3 28.07.2008 10:41
Высота taskbar'a papa_serg Общие вопросы Delphi 4 25.04.2008 16:44
Функция МАКС aslanbek Общие вопросы Delphi 2 15.03.2008 14:06
Аццкий треугольник и его высота Crazy D0G Помощь студентам 1 20.01.2008 18:25
Высота RichEdit по количеству строк. Компоратор Компоненты Delphi 2 15.05.2007 23:57