Ради примера, давайте предположим следующее представление для дерева:
- Атом
nil
представляет собой пустое дерево.
- Структура
tree/3
представляет собой непустое дерево tree(Left , Right , Payload)
где Left
и Right
представляют (соответственно, и рекурсивно) левые и правые поддеревья, и Payload
является полезной для узла: в вашем случае, список.
Многие или наиболее рекурсивные проблемы имеют 1 или 2 «особых случая» и более общий случай. Это ничем не отличается:
Особый случай: пустое дерево: сплющивание дает пустой список.
Общий случай сводится к роли непустое дерево: прокатка состоит из следующих этапов:
Код Prolog для достижения этой цели в значительной степени совпадает с английским описанием выше:
flatten_tree(nil , [] ) . % flattening the empty tree yields an empty list, n'est-ce-pas?
flatten_tree(tree(Left,Right,Payload) , Result) :- % flattening a non-empty tree consists of
flatten_tree(Left , Prefix) , % - flattening the left subtree,
flatten_tree(Right , Suffix) , % - flattening the right subtree,
concatenate(Prefix , Payload , Suffix , Result) % - concatenating the three parts
. % - easy!
concat(Xs, Ys , Zs , Rs) :-
append(Xs,Ys,T1) ,
append(T1,Zs,Rs)
.
можно отметить что другой подход может заключаться в использовании findall/3
и append/2
(если вы используете пролог SWI).
Прежде всего, необходимо предиката посетить дерево с помощью возвратов:
visit(tree(L,_,_) , P) :- visit(L , P) . % visit the left subtree
visit(tree(_,_,P) , P) . % visit the current node
visit(tree(_,R,_) , P) :- visit(R , P) . % visit the right subtree
Вы можете изменить порядок пунктов, чтобы получить заказ вы хотите. Как только у вас есть это, сплющивание дерева тривиально:
flatten_tree(Tree , List) :-
findall(X, visit(Tree,X) , Xs) ,
append(Xs,List)
.
Можете ли вы показать некоторые (7) примеры? – User
Как показано дерево в проблеме, которую вы должны решить ?. Попытайтесь выяснить, какие термины используются для его представления, и использовать предложения для решения каждой из них, используя рекурсию, когда у любого из этих терминов есть поддеревья. – migfilg