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

Определение минимальной длины пути в дереве

02.06.2014, 16:00. Показов 4241. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Очень нужна помощь! Необходимо решить задачу:
Дано дерево (необязательно бинарное). Определить путь минимальной длины от корня до листа.
Желательно с комментариями, спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.06.2014, 16:00
Ответы с готовыми решениями:

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

Поиск минимальной суммы в дереве
Здравствуйте! Есть дерево и необходимо найти минимальную сумму в дереве, т.е. от корня до листа. Помогите, пожалуйста.

Строки. Поиск слова минимальной длины, вывод этой длины, номер слова и само слово
Как организовать решение такой задачи? Может как-то через создание массивов, в ячейках которых будут номера слов и числа количества букв...

14
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
02.06.2014, 18:33
Поиск в ширину.
1
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
02.06.2014, 23:05
Минимальной длины? А что, в дереве от корня до листа может быть несколько путей?
1
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 11
03.06.2014, 11:20  [ТС]
Catstail, А как с помощью поиска в ширину решить эту задачу?

Somebody, в дереве несколько листов, они могут быть разной высоты, от корня до этих листов разные пути. Нужно найти минимальный из них
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
03.06.2014, 12:02
Rozumnaya, а Somebody-то прав... Если к одной вершине ведет несколько путей, значит в графе есть циклы. Но дерево - это граф без циклов.
0
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 11
03.06.2014, 17:40  [ТС]
К одной вершине ведет только один путь, просто листы могут быть на разной высоте.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
03.06.2014, 17:47
Тогда нужно формулировать задачу по-другому: Найти в дереве лист минимальной высоты
И поиск в ширину здесь не нужен.
0
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 11
03.06.2014, 18:01  [ТС]
я написала задание в том виде, в котором оно было нам дано. Но по сути нужно найти этот лист минимальной высоты, и результатом программы должна быть длина пути от корня до этого листа
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
03.06.2014, 18:07
Лучший ответ Сообщение было отмечено Rozumnaya как решение

Решение

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Show)
 
-- Извлекаем из дерева список листьев с высотами
 
getLs :: Tree a -> Int -> [(Int, Tree a)]
getLs Nil n = []
getLs (Node x Nil Nil) n = [(n, (Node x Nil Nil))]
getLs (Node x r l) n     = (getLs l (n+1)) ++ (getLs r (n+1)) 
 
-- Ищем минимум
 
task :: Tree a -> Tree a
task tree = snd (foldl (\ acc z -> if (fst z) < (fst acc) then z else acc) (head ls) (tail ls))
            where ls=getLs tree 0
 
 
Main> task (Node 1 (Node 0  Nil Nil) (Node 5 (Node 3 Nil Nil) (Node 6 Nil Nil)))
 
Node 0 Nil Nil     -- верно
Добавлено через 1 минуту
PS Мое решение для бинарных деревьев
1
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 11
03.06.2014, 18:10  [ТС]
Спасибо большое! А программа результатом выдаст длину или этот самый лист?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
03.06.2014, 18:19
Лучший ответ Сообщение было отмечено Rozumnaya как решение

Решение

Программа выдает лист. Но если чуть подправить, то выдаст (высоту, лист)

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Show)
 
getLs :: Tree a -> Int -> [(Int, Tree a)]
getLs Nil n = []
getLs (Node x Nil Nil) n = [(n, (Node x Nil Nil))]
getLs (Node x r l) n     = (getLs l (n+1)) ++ (getLs r (n+1)) 
 
task :: Tree a -> (Int, Tree a)
task tree = foldl (\ acc z -> if (fst z) < (fst acc) then z else acc) (head ls) (tail ls)
            where ls=getLs tree 0
 
Main> task (Node 1 (Node 0  Nil Nil) (Node 5 (Node 3 Nil Nil) (Node 6 Nil Nil)))
(1,Node 0 Nil Nil)
1
0 / 0 / 0
Регистрация: 02.06.2014
Сообщений: 11
12.06.2014, 17:37  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
task tree = snd (foldl (\ acc z -> if (fst z) < (fst acc) then z else acc) (head ls) (tail ls))
* * * * * * where ls=getLs tree 0
не могли бы вы объяснить, как работает эта строчка?
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4312 / 2104 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
12.06.2014, 18:06
Давайте немного упростим аналогичную строку из последнего кода:
Haskell
1
2
task tree = foldl1 (\ zMin@(nMin,leafMin) z@(n,leaf) -> if n < nMin then z else zMin) ls
    where ls = getLs tree
От Вами процитированного кода это отличается отсутствием ведущего snd. Суть в том, что здесь итеративно (см. описание foldl1) ищется такой элемент списка ls (объясните, что он выражает?), который обладает наименшей первой компоненты (что она выражает?).
2
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
12.06.2014, 19:40
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Давайте немного упростим
- на глаз стало длиннее...
0
165 / 164 / 23
Регистрация: 23.02.2011
Сообщений: 347
15.06.2014, 19:09
Для любого количества потомков
Haskell
1
2
3
4
5
6
7
8
9
10
11
data Tree a = Node a [Tree a]
 
find tree = loop [(tree,0)]
    where
        loop [] = error "O_o"
        loop ((Node a [],depth):t) = (a,depth)
        loop ((Node _ childs,depth):t) = loop (t ++ map (\c -> (c,depth+1)) childs)
 
main = do
    let tree = Node 0 [Node 1 [Node 4 [Node 6 []], Node 5 [Node 7 []]], Node 2 [Node 8 [], Node 9 [Node 10 []]]]
    print$ find tree
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.06.2014, 19:09
Помогаю со студенческими работами здесь

В файле заменить все слова максимальной длины на слова минимальной длины
Нужно в считанном из файла тексте заменить все слова максимальной длины на слова минимальной длины, а результат записать в новый файл....

Поменять первое слово максимальной длины и последнее слово минимальной длины
Отсортировать по убыванию слова любого предложения. Поменять первое слово максимальной длины и последнее слово минимальной длины

Трассировка пути в бинарном дереве
Добрый вечер. Ум за разум заходит уже. Прошу помощи. Реализовал нахождение максимального пути в дереве, а вот проследить вершины этого...

Нахождение пути в дереве глубиной N
Дано дерево глубины N (N — четное), каждая внутренняя вершина которого имеет 2 непосредственных потомка: А с весом 1 и В с весом (-1)....

Нахождение пути минимальной стоимости?
Задача такая, есть матрица размером m на n. Необходимо из нижнего левого угла попасть в верхний правый с минимальным количеством шагов....


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru