2013-12-17 4 views
2

Я пытаюсь определить простое двоичное дерево поиска. Он хранится в списках следующим образом: [Key, Left Tree, Right Tree]. У меня проблема с моей логикой. Это то, что у меня естьЛогическая проблема с настраиваемым деревом двоичного поиска

bstadd(K, [], [K,[],[]]). 
bstadd(K, [X|_], [X, [], [K, [], []]]) :- K > X. 
bstadd(K, [X, [], [K, [], []]], [X|_]) :- K < X. 

Это то, что я запрашиваю

1 ?- bstadd(19, [],T1), bstadd(20,T1,T2), bstadd(21,T2,T3). 

это то, что я получаю из

T1 = [19, [], []], 
T2 = [19, [], [20, [], []]], 
T3 = [19, [], [21, [], []]] 

и это то, что мне нужно

[19, [], [20, [], [21, [], []]]] 

Любая помощь будет замечательной. Я несколько дней стучал головой о стену.

+0

Использование списков с фиксированными числами. Это плохая практика. Ваше дерево было бы лучше представлено рекурсивным 't (K, L, R)' – CapelliC

ответ

2

Это мое решение. Дайте мне знать, что вы думаете, и если вам будет трудно это понять, я буду рад помочь вам.

bstadd(Value, [], [Value,[],[]]). 
bstadd(Value,[Key,Left,Right],X) :- Value \= Key , % no duplicates in BST 
            (
             Value < Key -> % if Value < Key 
             % then add to left side 
             bstadd(Value,Left,Rez) , 
             X = [Key,Rez,Right] 
             ; %else (Value > Key) 
             % then add to right side 
             bstadd(Value,Right,Rez) , 
             X = [Key,Left,Rez] 
            ). 
+0

. Я бы предпочел более чистый код. Внутренняя скобка на 'If-> Then; Else' не требуется. То же самое для глубокого интервала в теле рекурсивной оговорки. – CapelliC

+0

Лично мне гораздо легче читать код, подобный этому :) Неужели это слишком большой грех, чтобы оставить такой код? – ssBarBee

+0

Это определенно унииоматично, если в строке 1 есть 'Tree = [Key, Left, Right]' вместо того, чтобы просто использовать '[Key, Left, Right]' в голове. И 'not (X = Y)' лучше выражено 'X \ = Y'. Но интервал не является греховным (хотя я бы использовал больше пробелов вокруг запятых). –

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