![]() |
|
|
![]()
|
|
| blur |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 9.11.2004 Репутация: нет Всего: 1 |
Мне нужно создать бинарное упорядоченное дерево. Есть предикат, который создает узел в дереве:
дерево получается хоть и упорядоченное, но не бинарное (если ввести 1,2,3, то получается 1-корень,2-правое,3-правое, а надо 2-корень, 1-левое, 3-правое). Помогите пожалуйста модифицировать данный предикат. |
|||
|
||||
| Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 6 Всего: 50 |
Нет, все делается, как и должно быть. Дерево бинарное, но каждая левая ветвь остается пустой, т.к. на вход подаешь последовательность чисел уже в упорядоченном виде. Структура упорядоченного дерева будет зависеть от того, в какой последовательности подаешь числа. Смотри:
В последнем случае получили именно то, про что ты говорил "надо". Если же нужно не просто упорядоченное дерево, а именно в каждом случае также, как в последнем, то такое дерево называется сбалансированным. -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
| blur |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 9.11.2004 Репутация: нет Всего: 1 |
Artemios,
Спасибо за ответ, но мне нужно именно чтобы вставка элемента в дерево не зависела от порядка вводимых чисел. При вводе очередного числа дерево должно очевидно перестраиваться - вот это то у меня как раз и не получается. |
|||
|
||||
| Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 6 Всего: 50 |
blur, Для сбалансированного дерева (АВЛ-дерева) высота левого и правого поддеревьев отличается не более чем на 1.
Алгоритм добавления вершины в АВЛ-дерево Однако, более эффективна работа с красно-черными деревьями (почти сбалансированными), у которых высота левого и правого поддерева отличается не более чем на 2. А лгоритмы вставки в красно-черное дерево можно посмотреть например здесь или здесь . Вообще, в сети много про них пишут. Посмотри, если не будет получаться -- пиши. -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
| blur |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 9.11.2004 Репутация: нет Всего: 1 |
Ну с теорией я вроде разобрался, но все примеры по ссылкам не на прологе. Как это сделать например на си мне понятно. Так что не мог бы ты мне написать нужный предикат - лабу скоро нужно сдавать |
|||
|
||||
| Artemios |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 6 Всего: 50 |
Ну например АВЛ-дерево (идеально сбалансированное). Сделал "в лоб" (то есть не оптимально) по картинкам из ссылки добавление вершины в АВЛ-дерево :
Проверка:
Деревья конечно могут немного различаться, однако в любом случае имеем идеально сбалансированное дерево.
С тебя пиво -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
||||||
|
|||||||
| blur |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 9.11.2004 Репутация: нет Всего: 1 |
||||
|
||||
| Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 6 Всего: 50 |
И на том спасибо -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
| Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 6 Всего: 50 |
Кстати, вот более хорошее решение:
AVL-дерево (из кн. И. Братко "Программирование на языке Пролог для искусственного интеллекта") -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
![]()
|
| Правила форума Prolog | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Prolog | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |