2013-12-17 4 views
2

간단한 이진 검색 트리를 정의하려고합니다. 그것은 [Key, Left Tree, Right Tree]와 같은 목록에 저장됩니다. 내 논리에 문제가있어. 이것은 내가이 나는 이것이 내가논리 사용자 지정 이진 검색 트리 문제

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

나갈 것입니다

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

쿼리 무엇

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

이 무엇이며 이것이 내가해야 할 것입니다

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

어떤 도움이라도 훌륭합니다. 나는 며칠 동안 내 머리를 벽에 치고 있었다.

+0

고정 num.of.elements가있는 목록을 사용하는 것은 좋지 않습니다. 당신의 트리는 반복적 인'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

머리글에서'[Key, Left, Right]'를 사용하는 대신 1 행에'Tree = [Key, Left, Right]'를 사용하는 것은 확실히 독자적입니다. 그리고'not (X = Y)'는'X \ = Y'로 잘 표현됩니다. 그러나 간격은 죄가 없습니다 (그러나 나는 쉼표 주변에 더 많은 공백을 사용합니다). –