7.1 datatype文によるデータ型の定義
問 7.1
pre-order表現に使用する区切り文字を固定すると,任意の2分木は,唯 一のpre-order表現を持つことを示せ. (ヒント:以下の2つの性質を示せばよい. (1)任意の2分木はpre-order表現を持つ. (2)2分木とが同一のpre-order表現をもてば,である. )
解答例 2分木の構造に関する帰納法でしめす。
-
1.
木がEmptyの時。空文字列が唯一のpre-order表現である。
-
2.
木がNode(a, , )の時。 帰納法の仮定より、およびはそれぞれ唯一のpre-order表現をもつ。 与えられた木はpre-order表現を持つ。が唯一の表現であるから、 この表現も唯一である。
問 7.2
searchLP および searchRP を書き,decompose,さらに fromPreOrder を完成させ,テストを行え.
解答例 searchLP および searchRPの例を以下にしめす。
fun searchLP s p =
if substring(s,p,1) = "(" then p
else searchLP s (p+1)
fun searchRP s p n =
case substring(s,p,1) of
"(" => searchRP s (p+1) (n+1)
| ")" => if n=0 then p else searchRP s (p+1) (n - 1)
| _ => searchRP s (p+1) n
問 7.3
2分木の文字列表現には,上記のpre-order表現以外に, 以下の2つの表現がある.
区切り文字を固定するならば,2分木は,唯一のpost-order表現および in-order表現を持つことを示せ.
これら2つの表現から string tree 型データを生成する関数, fromPostOrder および fromInOrder を定義せよ.
解答例 唯一のpost-order表現およびin-order表現を持つことの証明は、問 7.1におけるpre-order表現の場合と同様である。
fromPostOrder および fromInOrderを書くためには、対応する decomposeを書く必要がある。それらの定義例を以下に示す。
fun decomposeIn s =
let val lp1 = searchLP s 0
val rp1 = searchRP s (lp1+1) 0
val lp2 = searchLP s rp1
val rp2 = searchRP s (lp2+1) 0
in {root=substring (s,rp1+1,lp2 - rp1 - 1),
left=substring (s,lp1+1,rp1-lp1 -1),
right=substring (s,lp2+1,rp2 - lp2-1)}
end
fun fromInOrder s =
if s = "" then Empty
else let val {root,left,right} = decomposeIn s
in Node(root,fromInOrder left,fromInOrder right)
end
fun decomposePost s =
let val lp1 = searchLP s 0
val rp1 = searchRP s (lp1+1) 0
val lp2 = searchLP s rp1
val rp2 = searchRP s (lp2+1) 0
in {root=substring (s,rp2+1,size s - rp2 - 1),
left=substring (s,lp1+1,rp1-lp1 -1),
right=substring (s,lp2+1,rp2 - lp2-1)}
end
fun fromPostOrder s =
if s = "" then Empty
else let val {root,left,right} = decomposePost s
in Node(root,fromPostOrder left,fromPostOrder right)
end
問 7.4
上の例では,「空の木」を使って2分木を定義したが,「子を持たない木」を使っ た以下のような定義も可能である.
-
1.
データのみからなるノードは2分木である.
-
2.
がデータ,が2分木なら, は,をノードのデータ,を左右の部分木とする2分 木である.
-
3.
がデータ,が2分木なら, は,をノードのデータ,を左の部分木とする2分木である.
-
4.
がデータ,が2分木なら, は,をノードのデータ,を右の部分木とする2分 木である.
この定義に対応するデータ型’a newTreeを定義せよ.
解答例 問題の定義をそのままコードすると、以下の型定義を得る。
datatype ’a newTree
= Leaf of ’a
| Node of ’a * ’a newTree * ’a newTree
| NodeL of ’a * ’a newTree
| NodeR of ’a * ’a newTree