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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2014, 00:13   #1
ujif
Пользователь
 
Регистрация: 24.02.2013
Сообщений: 28
По умолчанию определить высоту бинарного дерева

функция определяет высоту бинарного дерева
все работает и дает верный результат
как происходит обход дерева я понимаю
НО в данном случае не пойму, откуда
появляются значения в переменных l и r
им нигде никакие значения не присваиваюся
каким образом они сравниваются?
смотрел в отладчике и call stack и ничего
не отображается ,,может кто прояснит данную
ситуацию
прошу прощения за неформатированный вывод данного кода
я не знаю как это здесь делается
Код:
 type Pointer =^ Element;
     Element = record
       inf: Integer;
       left,right: Pointer;
     end;
function CountOfLevels(P: Pointer):integer;
var l,r,x:integer;
begin
        if p<>nil then begin
                                   l:=CountOfLevels(left);
                                   r:=CountOfLevels(right);
                                   if l<r then x:=r else x:=l;
                                   CountOfLevels:=x+1;
                            end
                     else CountOfLevels:=0;
end;

Последний раз редактировалось Stilet; 03.12.2014 в 07:36.
ujif вне форума Ответить с цитированием
Старый 03.12.2014, 00:53   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Что же это за умный компилятор такой? В Дельфи только так работает:
Код:
type
  Pointer = ^Element;

  Element = record
    inf: Integer;
    left, right: Pointer;
  end;

function CountOfLevels(P: Pointer): Integer;
var
  l, r, x: Integer;
begin
  if P <> nil then
  begin
    l := CountOfLevels(P.left);
    r := CountOfLevels(P.right);
    if l < r then
      x := r
    else
      x := l;
    CountOfLevels := x + 1;
  end
  else
    CountOfLevels := 0;
end;
Вопрос не понял. Как это не присваиваются значения l и r? Вон же рекурсивные вызовы CountOfLevels.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 03.12.2014, 01:08   #3
ujif
Пользователь
 
Регистрация: 24.02.2013
Сообщений: 28
По умолчанию

Уважаемый BDA я понимаю что есть рекурсивные вызовы CountOfLevels
я не пойму какой они результат выдают в переменные l и r
не понятно откуда он берется , ведь функция только шарится
по правой и левой веткам обходя все дерево.как он возникает этот
результат ,почему возможно здесь ,сравнивать переменные l и r
надеюсь внятно объяснил....ищу гуглю ,...ничего нигде
ujif вне форума Ответить с цитированием
Старый 03.12.2014, 02:02   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Вот теперь вопрос более понятен.
Для пустого дерева (P = nil) высота равна 0.
Для непустого дерева высота равна максимуму из высот поддеревьев (в переменных l и r оказываются высоты поддеревьев) плюс один.
Нарисуйте какое-нибудь простенькое дерево и подпишите у него высоту для каждой вершины. Затем "вызовите" описанную функцию для любого узла дерева и проследите весь ход по дереву.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 03.12.2014, 03:41   #5
ujif
Пользователь
 
Регистрация: 24.02.2013
Сообщений: 28
По умолчанию

Спасибо Уважаемый BDA за поддержку

смотрю в отладчике ...
в l и r при возврате из рекурсии
вылазят единицы ,то в l то в r
но в какой момент они там возникают = не пойму
и почему именно единицы, разве не должен там быть мусор всякий..

Последний раз редактировалось Stilet; 04.12.2014 в 07:58.
ujif вне форума Ответить с цитированием
Старый 03.12.2014, 12:36   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Пусть есть дерево высоты три.
A: (left=B, right=nil)
B: (left=C, right=nil)
C: (left=nil, right=nil)

Вызываем CountOfLevels(@A):
P = @A (<> 0)
l = CountOfLevels(@B) = 2
r = CountOfLevels(nil) = 0
Возврат 3

Вызываем CountOfLevels(@B):
P = @B (<> 0)
l = CountOfLevels(@C) = 1
r = CountOfLevels(nil) = 0
Возврат 2

Вызываем CountOfLevels(@C):
P = @C (<> 0)
l = CountOfLevels(nil) = 0
r = CountOfLevels(nil) = 0
Возврат 1

Вызываем CountOfLevels(nil):
P = nil
Возврат 0

Красным помечены результаты, которые вернула соответствующая функция.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 03.12.2014, 13:52   #7
ujif
Пользователь
 
Регистрация: 24.02.2013
Сообщений: 28
По умолчанию

Спасибо за поддержку Уважаемый BDA
если найдется еще немного времени у Вас для меня....
тут ,как я понимаю ,идет сравнение
правой ветки p^.right в которой постоянно nil это 0
и левой p^.left ,в которой адрес на ячейку
тогда возникло 2 вопроса
1 Это такое свойство функции ,что когда в ней
адрес не равен 0(nil) ,возвращать результат равный 1(единице)
то есть если к примеру p^.left = 0x20e808(от фонаря взял адрес)
в этом случае CountOfLevels(p^.left)=1 ,то есть в переменную
L пойдет цифра 1
2 если в B и в А (в Вашем примере) ,поставить по 1 потомку
справа ...здесь у меня образ картины пропадает ..с чем тогда
сравниваеются адреса в В ,тут с обеих сторон "засада"
и потом, (функция работает конечно правильно,просто я дурак)
посчитала родимая слева высоту равную 2 и пошла вправо
а там по высоте - единица, почему не путается результат
например не возвращается эта единица ,или высота 2 слева не
прибавляется к высоте справа

вот такой кавардак...понимаю что скорее всего гружу Вас на всю ОС
может отошлете куда чего почитать ...заранее Спасибо
ujif вне форума Ответить с цитированием
Старый 03.12.2014, 23:20   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Нет, на всю не грузите
Я не расписал полностью всю функцию.
Пусть есть какое-то дерево.
Вызвали для его вершины функцию CountOfLevels.
Теперь уже в функции смотрим на полученный ею адрес узла дерева.
Если адрес равен nil (никуда не указывает), то смело возвращаем 0.
Если адрес не равен nil, то получается, что передан именно узел дерева.
Значит высота уже равна минимум 1.
Но у этого узла также есть два поддерева (пустых или нет).
Значит высота для этого узла будет 1 + максимум из высот его поддеревьев.
Чтобы узнать их высоты, вызываем для них функцию CountOfLevels.
Отослать могу разве что к https://ru.wikipedia.org/wiki/Рекурсивная_функция.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 03.12.2014, 23:42   #9
ujif
Пользователь
 
Регистрация: 24.02.2013
Сообщений: 28
По умолчанию

Спасибо за поддержку Уважаемый BDA
отправился по ссылке
ujif вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация бинарного дерева на C# NastyaShuvalova C# (си шарп) 0 25.02.2014 19:24
Заполнение бинарного дерева Kallis Общие вопросы C/C++ 0 17.12.2013 03:56
преобразование бинарного дерева Lerris Общие вопросы C/C++ 0 09.03.2012 21:12
Построение бинарного дерева LordAlex91 Общие вопросы C/C++ 2 18.02.2012 15:49
Составление бинарного дерева [MI_nor] Общие вопросы C/C++ 1 08.05.2009 00:28