2013-12-16 3 views
1

Это упражнение 3.5 от Узнать пролог сейчас. Они выразились перед объяснением списков, поэтому мне нужна процедура, которая не включает списки.Обмен двоичных деревьев в прологе

Задача состоит в замене листьев вложенных двоичных деревьев. Если запрос

swap(tree(tree(leaf(1), leaf(2)), leaf(4)), T). 

ответ должен быть

T = (tree(leaf(4), tree(leaf(2), leaf(1))). 

С

swap((X, Y), (Y, X)). 

swap(tree(X, Y), T) :- 
    swap((X, Y), (Y, X)), 
    T = (Y, X). 

Я получаю

T = (leaf(4), tree(leaf(1), leaf(2))). 

Как вы видите leaf(1) и leaf(2) не г et сменяется. Мне нужны некоторые подсказки или даже ваша процедура, и она должна работать с любой глубиной узлов. Благодарю.

+0

Это прописано s.w.a.p.p.e.d. и s.w.a.p.p.i.n. –

+0

Также написано e.d.i.t. – SQB

+0

Благодарим за исправления. Я знаю, что мой английский далеко не хорош. Провация в Италии. – vincent

ответ

6

У вас есть базовый чехол для замены листа, а общий случай заменяет дерево! Для листа, ничего не делать:

swap(leaf(X), leaf(X)). 

При перестановке дерево, вы должны поменять свои листья тоже, так что

swap(tree(X,Y), tree(Y1,X1)) :- 
    swap(X,X1), 
    swap(Y,Y1). 
+0

Спасибо за ясное объяснение Джоэла. – vincent

Смежные вопросы