このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1354070278/119
#  [1]C言語 
#  [2]http://ime.nu/www.dotup.org/uploda/www.dotup.org3700396.jpg 
#  探索木についての課題です 
#  問題1. データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。
#  
#  問題2. 前問をプログラムとして、表示しなさい。表示する関数は再帰的に書きなさい。
#  左の子(部分木) を print,node を print, 右の子 (部分木) を print のように表示することをDFS 中間順と言います。
#  
#  問題3. 標準入力から文字を入力させ、その文字によって2分探索木に対して以下の動作をするプログラムを作成せよ。
#  s ---> 数を1つ標準入力から入力されてデータが存在するか表示
#  i ---> 数を1つ標準入力から入力させて2分探索木に追加
#  p ---> 今まで入力された数をすべて表示 (DFS中間順で)
#  q ---> quit
#  
#  問題4. 0から9999の整数の乱数を10000個生成して、2分探索木を作り、データの
#  総数、木の深さの最大値、データの最小値と最大値を求めるプログラムを作成し
#  て確認せよ。
#  
#  [3]ubuntu 
#  gcc 
#  c言語 
#  [4]期限:木曜日6:00 
#  宜しくお願いします。 
# 

二分探索木ラベルの生成(_値ならび) :-
        nth1(_nth1,_値ならび,_値),
        atomic_list_concat(['L','_',_nth1],_ラベル),
        assertz(二分探索木ラベル(_ラベル,_値)),
        fail.
二分探索木ラベルの生成(_).

根を作る(_値,_ラベル) :-
        二分探索木ラベル(_ラベル,_値),
        asserta(根(_ラベル,[],[])).

枝を作る(_値,_ラベル) :-
        二分探索木ラベル(_ラベル,_値),
        asserta(枝(_ラベル,[],[])).

枝に追加(_根のラベル,_値) :-
        二分探索木ラベル(_根のラベル,_根の値),
        二分探索木ラベル(_値のラベル,_値),
        枝に追加(_根のラベル,_値のラベル,_根の値,_値).


枝に追加(_根のラベル,_値のラベル,_根の値,_値) :-
        _値 @< _根の値,
        retract(枝(_根のラベル,[],_右枝)),
        枝を作る(_値),
        asserta(根(_根のラベル,_値のラベル,_右枝)),!.
枝に追加(_根のラベル,_値のラベル,_根の値,_値) :-
        _値 @< _根の値,
        枝(_根,_左枝,_右枝),
        枝に追加(_左枝,_値).
枝に追加(_根のラベル,_値のラベル,_根の値,_値) :-
        _値 @>= _根の値,
        retract(枝(_根,_左枝,[])),
        枝を作る(_値),
        asserta(根(_根のラベル,_左枝,_値のラベル)),!.
枝に追加(_根のラベル,_値のラベル,_根の値,_値) :-
        _値 @>= _根の値,
        枝(_根のラベル,_左枝,_右枝),
        枝に追加(_右枝,_値).

'データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。' :-
        二分探索木ラベルの生成([6,4,3,8,5,9,7]),
        根を作る(6,_根のラベル),
        append(_,[N|R],[4,3,8,5,9,7]),
        枝に追加(_根のラベル,N),
        R = [].