![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 24.02.2013
Сообщений: 28
|
![]()
функция определяет высоту бинарного дерева
все работает и дает верный результат как происходит обход дерева я понимаю НО в данном случае не пойму, откуда появляются значения в переменных l и r им нигде никакие значения не присваиваюся каким образом они сравниваются? смотрел в отладчике и call stack и ничего не отображается ,,может кто прояснит данную ситуацию прошу прощения за неформатированный вывод данного кода я не знаю как это здесь делается Код:
Последний раз редактировалось Stilet; 03.12.2014 в 07:36. |
![]() |
![]() |
![]() |
#2 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,430
|
![]()
Что же это за умный компилятор такой? В Дельфи только так работает:
Код:
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись
![]() |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 24.02.2013
Сообщений: 28
|
![]()
Уважаемый BDA я понимаю что есть рекурсивные вызовы CountOfLevels
я не пойму какой они результат выдают в переменные l и r не понятно откуда он берется , ведь функция только шарится по правой и левой веткам обходя все дерево.как он возникает этот результат ,почему возможно здесь ,сравнивать переменные l и r надеюсь внятно объяснил....ищу гуглю ,...ничего нигде |
![]() |
![]() |
![]() |
#4 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,430
|
![]()
Вот теперь вопрос более понятен.
Для пустого дерева (P = nil) высота равна 0. Для непустого дерева высота равна максимуму из высот поддеревьев (в переменных l и r оказываются высоты поддеревьев) плюс один. Нарисуйте какое-нибудь простенькое дерево и подпишите у него высоту для каждой вершины. Затем "вызовите" описанную функцию для любого узла дерева и проследите весь ход по дереву.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись
![]() |
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 24.02.2013
Сообщений: 28
|
![]()
Спасибо Уважаемый BDA за поддержку
смотрю в отладчике ... в l и r при возврате из рекурсии вылазят единицы ,то в l то в r но в какой момент они там возникают = не пойму и почему именно единицы, разве не должен там быть мусор всякий.. Последний раз редактировалось Stilet; 04.12.2014 в 07:58. |
![]() |
![]() |
![]() |
#6 |
МегаМодератор
СуперМодератор
Регистрация: 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 Красным помечены результаты, которые вернула соответствующая функция.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись
![]() |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 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 слева не прибавляется к высоте справа вот такой кавардак...понимаю что скорее всего гружу Вас на всю ОС может отошлете куда чего почитать ...заранее Спасибо |
![]() |
![]() |
![]() |
#8 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,430
|
![]()
Нет, на всю не грузите
![]() Я не расписал полностью всю функцию. Пусть есть какое-то дерево. Вызвали для его вершины функцию CountOfLevels. Теперь уже в функции смотрим на полученный ею адрес узла дерева. Если адрес равен nil (никуда не указывает), то смело возвращаем 0. Если адрес не равен nil, то получается, что передан именно узел дерева. Значит высота уже равна минимум 1. Но у этого узла также есть два поддерева (пустых или нет). Значит высота для этого узла будет 1 + максимум из высот его поддеревьев. Чтобы узнать их высоты, вызываем для них функцию CountOfLevels. Отослать могу разве что к https://ru.wikipedia.org/wiki/Рекурсивная_функция.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись
![]() |
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 24.02.2013
Сообщений: 28
|
![]()
Спасибо за поддержку Уважаемый BDA
отправился по ссылке |
![]() |
![]() |
![]() |
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Реализация бинарного дерева на 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 |