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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2014, 16:05   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от mishammm Посмотреть сообщение
вот написал но оно сичтает сразу всю сумму всех елементов, а нужно от корня к заданому узлу
Вот Вы странный человек!

Во-первых, откуда ВДРУГ возникла необходимость подсчёта суммы?!
Ведь у Вас в задании сказано:
Цитата:
Нужно в дереве подсчитать количество узлов по пути от корня дерева до узла значение которых введено с клавиатуры
Ладно. Допустим, задание изменилось и теперь нужно подсчитать сумму всех пройденных до нужного узла. Но Вы ведь даже не вводите значение узла, который нужно найти!!!

во-вторых, программа делает ровно то, что Вы ей велите делать.
Велели при вводе значения "4" сделать
4: writeln('Sum: ', sum / num);
Вот она и печатает сумму, делённую на единицу.
Поймите, что если Вы не будете производить нужные действия по поиску и подсчёту (хоть количества, хоть суммы), то сами по себе эти действия ниоткуда не возникнут.

в-третьих, Вам BDA написал код рекурсивной функции по подсчёту узлов при поиске нужного узла. Я не нашёл его в вашей программе. Этот код Вам оказался не нужен?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.05.2014, 21:05   #12
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: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;





Function PathLength(const Root : pnode; value : integer) : integer;
begin
  if Root = nil then
    result := 0
  else if Root^.data = value then
    result := 1
  else begin
    if value > Root^.data then
      result := PathLength(Root^.right, value)
    else
      result := PathLength(Root^.left, value);
    if result > 0 then inc(result);
  end;
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
root:=nil;
while true do begin
writeln('Add element - 1');
writeln('Delete element - 2');
writeln('Print - 3');
writeln('Exit - 4');
write('Your choice: ');
read(choice);
case choice of
1:
begin
writeln('Enter element: ');
readln(key);
insert(root,key);
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:exit;
end;
writeln;
end

end.
у меня посдений вопрос, что должно быть в вызове, в основной программе
mishammm вне форума Ответить с цитированием
Старый 07.05.2014, 21:17   #13
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Код:
writeln('Enter element for search: ');
readln(key);
tmp := PathLength(root, key);
if tmp = 0 then
  writeln('Element does not exist')
else
  writeln('Element ', key, ' - length of path ', tmp);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.05.2014, 21:18   #14
mishammm
Форумчанин
 
Регистрация: 21.09.2013
Сообщений: 232
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
writeln('Enter element for search: ');
readln(key);
tmp := PathLength(root, key);
if tmp = 0 then
  writeln('Element does not exist')
else
  writeln('Element ', key, ' - length of path ', tmp);
благодарю извините за за потраченное время
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