このディレクトリの索引
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 
#  宜しくお願いします。 
# 

:- dynamic([木/3,根/1,二分探索木ラベル/2]).

二分探索木ラベルの生成(_値ならび,_ラベルならび) :-
        findall(_ラベル,(
                    member(_値,_値ならび),
                    二分探索木ラベルの候補(_ラベル),
                    assertz(二分探索木ラベル(_ラベル,_値))),
                _ラベルならび).

二分探索木ラベルの候補(_ラベル) :-
        N is random(900000) + 100000,
        atomic_list_concat(['L',N],_ラベル),
        \+(二分探索木ラベル(_ラベル,_)),!.
二分探索木ラベルの候補(_ラベル) :-
        二分探索木ラベルの候補(_ラベル).

根を作る(_ラベル) :-
        asserta((根(_ラベル) :- !)),
        木を作る(_ラベル).

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

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

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

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

二分探索木全体を表示する :-
        根(_根のラベル),
        木を表示する(_根のラベル).

木を表示する([]) :- !.
木を表示する(_木の根のラベル) :-
        木(_左枝,_木の根のラベル,_右枝),
        木を表示する(_左枝,_木の根のラベル,_右枝).

木を表示する(_左の枝,_木の根,_右の枝) :-
        二分木探索ラベル(_木の根ラベル,_木の根の値),
        木を表示する(_左枝),
        writef('%t ',[_木の根の値]),
        木を表示する(_右枝).