0 / 0 / 0
Регистрация: 19.09.2015
Сообщений: 2
1

Поиск количества совпадающих элементов в бинарном дереве

22.11.2015, 14:34. Показов 1333. Ответов 2

Author24 — интернет-сервис помощи студентам
Здравствуйте. Нужно найти количество совпадающих элементов в бинарном дереве. Я написал следующие правила
Prolog
1
2
3
4
5
6
7
8
9
element(t(X,_,_), X).
element(t(_, Left, Right), X) :- element(Left,X);element(Right,X).
 
counter(nil,_,0) :- !.
counter(t(K,TL,TR),K,N) :- counter(TL,K,NL), counter(TR,K,NR), N is NL+NR+1.
counter(t(_,TL,TR),K,N) :- counter(TL,K,NL), counter(TR,K,NR), N is NL+NR.
 
func(Tree) :- element(Tree, Elements), func(Tree), counter(Tree, Elements, Num),
write(Elements), write('-'), write(Num), nl.
но получается не то что хотел.

Например:
Prolog
1
2
3
4
?- func(t(158,t(158,nil,nil), t(152,nil,nil))).
158-2
 
yes
а расчитывал на
Prolog
1
2
3
4
5
6
?- func(t(158,t(158,nil,nil), t(152,nil,nil))).
158-2
158-2
152-1
 
yes
По отдельности element и counter работают, соответственно 1-й выводит все элементы дерева, а 2-й кол-во вхождений элемента в дерево. Помогите разобраться в чем же дело
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2015, 14:34
Ответы с готовыми решениями:

Функция для нахождения количества элементов в бинарном дереве
Помогите написать функцию для нахождения количества элементов в бинарном дереве. реализуйте...

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

Поиск одинаковых элементов в бинарном дереве
Нужно вывести на экран все повторяющиеся элементы в бинарном дереве. # include <iostream> #...

Поиск одинаковых элементов в бинарном дереве.
Задано бинарное дерево. Определить, есть ли в этом дереве хотя бы два одинаковых элемента. Вывести...

2
Фрилансер
3704 / 2076 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
23.11.2015, 05:49 2
Лучший ответ Сообщение было отмечено STRANN1K_454 как решение

Решение

Цитата Сообщение от STRANN1K_454 Посмотреть сообщение
расчитывал на
Не совсем понятно, почему Вы на это рассчитывали.
Приведенный вариант вообще входит в бесконечную рекурсию на вложенном вызове func

Нужно написать что-то вроде
Prolog
1
2
3
4
5
6
func(Tree) :- 
    element(Tree, Elements),    % <--- Здесь возникает развилка
    counter(Tree, Elements, Num),
    write(Elements), write('-'), write(Num), nl,
    fail;    % <--- Здесь происходит принудительный откат к развилке
    write('---').   % <--- А сюда попадём, когда варианты перебора в развилке закончатся
И обязательно поставьте дополнительное отсечение во втором правиле counter, иначе получите много неправильных вариантов.
1
0 / 0 / 0
Регистрация: 19.09.2015
Сообщений: 2
23.11.2015, 06:49  [ТС] 3
Цитата Сообщение от Black Fregat Посмотреть сообщение
Не совсем понятно, почему Вы на это рассчитывали.
Приведенный вариант вообще входит в бесконечную рекурсию на вложенном вызове func
Да, func там и вправду не нужен. Я его добавил в попытках отладки, а затем случайно скопировал в сообщение. Заметил это по истечении 5 минут и не смог отредактировать.

Все заработало, спасибо огромное!
0
23.11.2015, 06:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2015, 06:49
Помогаю со студенческими работами здесь

Поиск в бинарном дереве
Не получается организовать поиск в бинарном дереве по значению, а не по ключу. Использую дерево в...

Поиск в Бинарном Дереве!
Задано бинарное дерево. Определить, есть ли в этом дереве хотя бы два одинаковых элемента....

Поиск в бинарном дереве
Составить рекурсивную функцию для определения первого элемента, у которого совпадают старшая и...

Поиск в бинарном дереве
Привет всем! Нужно написать код, с которым в бинарном дереве можно найти заданное пользователем...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru