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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2014, 22:40   #1
mishammm
Форумчанин
 
Регистрация: 21.09.2013
Сообщений: 232
По умолчанию Бинарные Деревья Паскаль

Здраствуйте, помогите пожалуйста с таким условием. Нужно в дереве подсчитать количество узлов по пути от корня дерева до узла значение которых введено с клавиатуры, если таких узлов несколько выбрать любой из них.
может кто наведите на что то похожее? ничего толком не могу найти по даной процедуре, плиз
С вводом, выводдом проблем не возникло, только с условием непонятки:

Нарыл что то в этом роде в интернете
Код:
type
tRefBinTree = ^tBinTree;
tBinTree = record
info : integer;
left : tRefBinTree;
right : tRefBinTree;
end;

function Nodes (inRefRoot : tRefBinBauTree) : integer;
begin
if (inRefRoot <> nil) then
    Nodes := 1 + Nodes(inrefRoot^.left) + Nodes(inrefRoot^.right)
else
    Nodes := 0;
end;
будет ли это правильным? если нет прошу напраьте меня на что то похожее. Спасибо
mishammm вне форума Ответить с цитированием
Старый 06.05.2014, 23:50   #2
mishammm
Форумчанин
 
Регистрация: 21.09.2013
Сообщений: 232
По умолчанию

ну хоть кто то. не прошу писать программу же, прошу только направить на путь истинный )
mishammm вне форума Ответить с цитированием
Старый 07.05.2014, 00:27   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
function PathLength(const Root : tRefBinTree; value : integer) : integer;
begin
  if Root = nil then
    result := 0
  else if Root^.info = value then
    result := 1 //0 - если не нужно считать сам узел
  else if value > Root^.info then
    result := 1 + PathLength(Root^.right, value)
  else
    result := 1 + PathLength(Root^.left, value);
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.05.2014, 00:32   #4
mishammm
Форумчанин
 
Регистрация: 21.09.2013
Сообщений: 232
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
function PathLength(const Root : tRefBinTree; value : integer) : integer;
begin
  if Root = nil then
    result := 0
  else if Root^.info = value then
    result := 1 //0 - если не нужно считать сам узел
  else if value > Root^.info then
    result := 1 + PathLength(Root^.right, value)
  else
    result := 1 + PathLength(Root^.left, value);
end;
спасибо
mishammm вне форума Ответить с цитированием
Старый 07.05.2014, 00:50   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Не за что, так как я соврал
Эта функция выдаст число узлов, даже если не найдет нужное значение, а лишь опустится до листов дерева.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.05.2014, 01:00   #6
mishammm
Форумчанин
 
Регистрация: 21.09.2013
Сообщений: 232
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Не за что, так как я соврал
Эта функция выдаст число узлов, даже если не найдет нужное значение, а лишь опустится до листов дерева.
вот блин ) не заметил даже, ну а если серьезно??
mishammm вне форума Ответить с цитированием
Старый 07.05.2014, 01:02   #7
mishammm
Форумчанин
 
Регистрация: 21.09.2013
Сообщений: 232
По умолчанию

Код:
procedure CountLevel(level: integer; root: ttree;
          const to_count: integer; var Counter: integer);
begin
  if (root = nil) or (level > to_count) then exit;
 
  if level = to_count then inc(Counter)
  else begin
    CountLevel(level + 1, root^.right, to_print, Counter);
    CountLevel(level + 1, root^.left, to_print, Counter);
  end;
end;
, вот так вызывать:
  for i := 0 to Pred(GetHeight(root)) do begin
    amount := 0;
    CountLevel(0, root, i, amount);
    Writeln(i:2, ' -> ', amount);
  end;
такое пойдет?
или например такая процедура подсчёта?
Код:
PROCEDURE LEAFS_COUNT( Q : ND; VAR K : INTEGER );
            BEGIN
                IF Q <> NIL THEN
                    BEGIN
                        LEAFS_COUNT( Q^.LEFT, K );
                        IF (Q^.LEFT = NIL) AND (Q^.RIGHT = NIL) THEN  K := K +1;
                        LEAFS_COUNT( Q^.RIGHT, K );
                    END;
            END;

Последний раз редактировалось mishammm; 07.05.2014 в 01:06.
mishammm вне форума Ответить с цитированием
Старый 07.05.2014, 01:18   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Не проверял на компилируемость.
Код:
function PathLength(const Root : tRefBinTree; value : integer) : integer;
begin
  if Root = nil then
    result := 0
  else if Root^.info = value then
    result := 1
  else begin
    if value > Root^.info then
      result := PathLength(Root^.right, value)
    else
      result := PathLength(Root^.left, value);
    if result > 0 then inc(result);
  end;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 07.05.2014 в 01:20.
BDA вне форума Ответить с цитированием
Старый 07.05.2014, 11:21   #9
mishammm
Форумчанин
 
Регистрация: 21.09.2013
Сообщений: 232
По умолчанию

вроде скомпилилось, а какая примерно должна быть основная программа?
mishammm вне форума Ответить с цитированием
Старый 07.05.2014, 11:32   #10
mishammm
Форумчанин
 
Регистрация: 21.09.2013
Сообщений: 232
По умолчанию

Код:
program BinaryTree;
uses crt;
type
    pnode = ^node;
    node = record
    data:integer;
    left:pnode;
    right:pnode;
    end;
var
   root:pnode;
   choice,key,sum,num:integer;
  

procedure print_tree(p:pnode;level:integer);
var
   i:integer;
begin
if p = nil then exit;
with p^ do begin
print_tree(right,level+1);
for i:=1 to level do write('    ');
writeln(data);
print_tree(left,level+1);
end;
end;

function find(root:pnode;key:integer;var p,parent:pnode):boolean;
begin
p:=root;
while p <> nil do begin
if key = p^.data then
begin find:=true; exit end;
parent:=p;
if key < p^.data
then p:=p^.left
else p:=p^.right;
end;
find:=false;
end;


procedure insert(var root:pnode;key:integer);
var
   p,parent:pnode;
begin
if find(root,key,p,parent) then begin
writeln('This element already exists ');exit; end;
new(p);
p^.data:=key;
p^.left:=nil;
p^.right:=nil;
if root = nil then root:=p
else
if key < parent^.data
then parent^.left:=p
else parent^.right:=p;
end;

procedure del(var root:pnode;key:integer);
var
   p,parent,y:pnode;
function descent(p:pnode):pnode;
var
   y,prev:pnode;
begin
y:=p^.right;
if y^.left = nil then y^.left:=p^.left
else begin
repeat
prev:=y;
y:=y^.left;
until y^.left=nil;
y^.left:=p^.left;
prev^.left:=y^.right;
y^.right:=p^.right;
end;
descent:=y;
end;


begin
if not find(root,key,p,parent) then begin
writeln('This element does not exist'); exit; end;
if p^.left = nil then y:=p^.right
else if p^.right = nil then y:=p^.left
else y:=descent(p);

if p = root then root:=y
else
if key < parent^.data
then parent^.left:=y
else parent^.right:=y;
dispose(p);
end;


begin
sum:=0;
num:=0;
root:=nil;
while true do begin
writeln('Add element - 1');
writeln('Delete element - 2');
writeln('Print - 3');
writeln('Sum - 4');
writeln('Exit - 5');
write('Your choice: ');
read(choice);
case choice of
1:
begin
writeln('Enter element: ');
readln(key);
insert(root,key);
sum:=sum+key;
num:=1;
end;
2:
begin
writeln('Enter element what need delete: ');
readln(key);
del(root,key);
end;
3:
begin
clrscr;
if root = nil then writeln('Tree empty')
else print_tree(root,0);
end;
4:writeln('Sum: ',sum/num);
5:exit;
end;
writeln;
end

end.
вот написал но оно сичтает сразу всю сумму всех елементов, а нужно от корня к заданому узлу
mishammm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
бинарные деревья((( Лиляля Помощь студентам 4 27.05.2012 20:22
бинарные деревья с++ Daniya.ru Общие вопросы C/C++ 1 25.11.2010 00:00
Бинарные деревья ZET78 Общие вопросы C/C++ 1 26.09.2010 20:41
бинарные деревья studentOne Помощь студентам 2 10.10.2009 16:45