2分木

30分プログラム、その689。ML系の言語といえばバリアント、バリアントと言えば木構造なので、2分木を作ってみました。
そのうち、B木とかに拡張できたらいいね。

使い方

- val t = List.foldl (curry insert) empty [10,3,1,4];
val t = Branch (10,Branch (3,Branch #,Branch #),Leaf) : int tree
- size t;
val it = 4 : int
- mem 10 t;
val it = true : bool
-
val it = true : bool
- mem 0 t;
val it = false : bool

ソースコード

datatype 'a tree = Leaf | Branch of 'a * 'a tree * 'a tree;

val empty = Leaf;

fun insert x Leaf = Branch (x,Leaf,Leaf)
  | insert x (tree as (Branch (y,left,right))) = if x < y then
						     Branch (y, insert x left, right)
						 else if x > y then
						     Branch (y, left, insert x right)
						 else (* x = y *)
						     tree;

fun size Leaf = 0
  | size (Branch (_,left,right)) = 1 + size left + size right;

fun mem x Leaf = false
  | mem x (Branch (y , left, right)) = x = y orelse mem x left orelse mem x right;

(* example *)
fun curry f (a,b) = f a b;

val t = List.foldl (curry insert) empty [10,3,1,4];