Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
1 / 1 / 0
Регистрация: 09.10.2017
Сообщений: 16

Дерево поиска

06.02.2019, 19:54. Показов 1513. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть тип данных, представляющий собой бинарное дерево поиска, в котором в каждой ячейке содержится ссылка на родительскую ячейку.
Haskell
1
2
3
4
5
data LinkedTree a = EmptyTree | Node a (LinkedTree a) (LinkedTree a) (LinkedTree a)
 
find :: LinkedTree a -> a -> Bool
insert :: LinkedTree a -> a -> LinkedTree a
remove :: LinkedTree a -> a -> LinkedTree a
Помогите реализовать функции вставки, поиска и удаления элемента.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.02.2019, 19:54
Ответы с готовыми решениями:

Двоичное дерево поиска
Описать структуру двоичного дерева поиска. Написать модуль, позволяющий добавлять элементы в дерево, удалять элементы из дерева с...

Бинарное дерево поиска
Необходимо реализовать структуру данных "бинарное дерево поиска" для целых чисел без балансировки. Реализация включает функции: ...

Бинарное дерево поиска
Необходимо реализовать структуру данных и все прилагаемые ниже функции для работы с ней. Балансировку реализовывать не нужно. --...

6
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9
06.02.2019, 21:14
Что означают три LinkedTree справа в определении типа? Бинарное дерево имеет две ветви, для чего третья?
find и remove с такими сигнатурами реализовать невозможно, т.к. недоступны сравнения. insert можно сделать только по какому ни будь простому алгоритму, вроде, добавлять всегда к самой правой ветви.
1
1 / 1 / 0
Регистрация: 09.10.2017
Сообщений: 16
06.02.2019, 21:47  [ТС]
Два LinkedTree - ссылки на левого и правого сына, а 3ий LinkedTree - ссылка на родительскую ячейку (как в типе DList ссылка на предыдущий элемент).

Думаю поиск может выглядеть как-то так, потому что для поиска родительская ячейка не имеет значения.. нет?

Haskell
1
2
3
4
5
find EmptyTree _ = False
find (Node value left right _) a
    | value > a = find left a
    | value < a = find right a
    | otherwise = True
0
Эксперт 1С
 Аватар для Tklwegsd
845 / 608 / 211
Регистрация: 24.07.2013
Сообщений: 2,102
06.02.2019, 22:20
Цитата Сообщение от BeaverBean Посмотреть сообщение
а 3ий LinkedTree - ссылка на родительскую ячейку
В Haskell это не ссылки.
1
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9
06.02.2019, 22:32
Цитата Сообщение от BeaverBean Посмотреть сообщение
Два LinkedTree - ссылки на левого и правого сына, а 3ий LinkedTree - ссылка на родительскую ячейку
Покажите как выглядит создание "вручную" такого дерева хотя бы из двух уровней.
Цитата Сообщение от BeaverBean Посмотреть сообщение
Думаю поиск может выглядеть как-то так
Тогда должно быть
Haskell
1
find :: Ord a => LinkedTree a -> a -> Bool
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
07.02.2019, 00:18
Цитата Сообщение от Curry Посмотреть сообщение
Покажите как выглядит создание "вручную" такого дерева хотя бы из двух уровней.
Кто-то забыл, что Хаскелл ленив? =)

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    data LinkedTree a
        = EmptyTree
        | Node a (LinkedTree a) (LinkedTree a) (LinkedTree a)
     
    root = Node 1 l r root
        where
            l = Node 2 EmptyTree EmptyTree l
            r = Node 3 EmptyTree EmptyTree r
     
    instance Show a => Show (LinkedTree a) where
        show EmptyTree = "{}"
        show (Node x EmptyTree EmptyTree _) = "{" ++ show x ++ "}"
        show (Node x l r _) = "{" ++ show x ++ " " ++ show l ++ " " ++ show r ++ "}"
     
    main = print root
=>

Code
1
{1 {2} {3}}
Добавлено через 8 минут
Точнее так:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
data LinkedTree a
    = EmptyTree
    | Node a (LinkedTree a) (LinkedTree a) (LinkedTree a)
 
root = Node 1 l r EmptyTree
    where
        l = Node 2 EmptyTree EmptyTree root
        r = Node 3 EmptyTree EmptyTree root
 
instance Show a => Show (LinkedTree a) where
    show EmptyTree = "{}"
    show (Node x EmptyTree EmptyTree _) = "{" ++ show x ++ "}"
    show (Node x l r _) = "{" ++ show x ++ " " ++ show l ++ " " ++ show r ++ "}"
 
left   (Node _ l _ _) = l
right  (Node _ _ r _) = r
parent (Node _ _ _ p) = p
 
main = do
    print root
    let rootLeft = left root
    print rootLeft
    print $ parent rootLeft
=>

Code
1
2
3
{1 {2} {3}}
{2}
{1 {2} {3}}
Добавлено через 9 минут
Но я бы сделал так:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
data LinkedTree a
    = Root a (LinkedTree a) (LinkedTree a)
    | Leaf a (LinkedTree a)
    | Branch a (LinkedTree a) (LinkedTree a) (LinkedTree a)
 
root = Root 1 l r
    where
        l = Branch 2 ll lr root
        r = Leaf 3 root
        ll = Leaf 21 l
        lr = Leaf 22 l
 
instance Show a => Show (LinkedTree a) where
    show (Root x l r)     = "{" ++ show x ++ " " ++ show l ++ " " ++ show r ++ "}"
    show (Leaf x _)       = "{" ++ show x ++ "}"
    show (Branch x l r _) = "{" ++ show x ++ " " ++ show l ++ " " ++ show r ++ "}"
 
left   (Root   _ l _)   = l
left   (Branch _ l _ _) = l
right  (Root   _ _ r)   = r
right  (Branch _ _ r _) = r
parent (Leaf   _ p)     = p
parent (Branch _ _ _ p) = p
 
main = do
    print root
    let rootLeft = left root
    print rootLeft
    print $ parent rootLeft
=>

Code
1
2
3
{1 {2 {21} {22}} {3}}
{2 {21} {22}}
{1 {2 {21} {22}} {3}}
Точнее, конечно, я бы не стал делать делать циклические связи в функциональном языке (за исключением простых вещей, типа repeat списка), может привести к фееричным приколам.
2
1 / 1 / 0
Регистрация: 09.10.2017
Сообщений: 16
07.02.2019, 12:49  [ТС]
Cделала добавление элемента
Haskell
1
2
3
4
5
6
7
8
newParent Empty a p0 = Node a Empty Empty p0 
newParent (Node v l r p) a p0 | a < v = let n = Node v (newParent l a n) r p0 in n
                              | otherwise = let n = Node v l (newParent r a n) p0 in n
 
insert ::(Ord a) => LinkedTree a -> a -> LinkedTree a
insert Empty a = Node a Empty Empty Empty
insert (Node v l r p) a | a < v = let n = Node v (newParent l a n) r p in n
                        | otherwise = let n = Node v l (newParent r a n) p in n
Помогите с удалением
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.02.2019, 12:49
Помогаю со студенческими работами здесь

Исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру
Помогите, не могу понять!( Нужно исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру. вот...

Преобразовать идеальное бинарное дерево в бинарное дерево поиска
Всем привет, я создал идельное бинарное дерево и написал к нему функции. Как мне теперь можно преобразовать его в бинарное дерево поиска?...

Дерево поиска
нужно записать в файл элементы дерева поиска в порядке убывания, используя приложенный модуль, который это дерево создает. Unit drp; ...

Дерево поиска
Всем добрый полдень:) Помогите пож-та решить вот такую вот задачку: В текстовом файле задан алфавит(на англ(a-z), нужно построить...

Дерево поиска
как построить дерево поиска на F#?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru