2013-12-17 39 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

使用具有固定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

在第1行有'Tree = [Key,Left,Right]',而不是在頭部使用'[Key,Left,Right]''這絕對是一種單一的方法。並且「不是(X = Y)」更好地表達爲「X \ = Y」。但間距不是有罪的(儘管我會在逗號周圍使用更多的空間)。 –