binary search tree
OK、 OCaml でa を書きました。
type 'a bstree =
|Node of 'a * 'a bstree * 'a bstree
|Leaf
let rec insert x = function
|Leaf -> Node (x, Leaf, Leaf)
|Node (y, left, right) as node ->
if x < y then
Node (y, insert x left, right)
else if x > y then
Node (y, left, insert x right)
else
node
上記のコードは、OCaml でデータ構造を使用する正しい方法で優れていると言われていました。
しかし、問題が見つかりました。これinsert
は、次のように、リストから bst を一度に作成する場合にのみ機能します。
let rec set_of_list = function
[] > empty
| x :: l > insert x (set_of_list l);;
したがって、リストから連続して bst を作成しても問題ありません。リストからすべてのノードを含む完全な bst を取得できます。
ただし、以前にビルドした bst があり、ノードを挿入したい場合、結果の bst には以前のツリーからの完全なノードが含まれません。よろしいですか?
では、以前のツリーを不変に保つために、以前のツリーのすべてのノードで新しい bst を作成するには、OCaml で bst をどのように記述すればよいでしょうか? 毎回古い bst からすべてのノードをコピーする必要がある場合、パフォーマンスに影響はありますか?
編集:
最初に、bst が 1 つの node で作成されるとしましょうt1 = (10, Leaf, Leaf)
。
それから私はそうしますlet t2 = insert 5 t1
、そして私は得t2 = (10, (5, Leaf, Leaf), Leaf)
ますよね?t2 の中で、変数を与えましょうc1 to the child node (5, Leaf, Leaf)
それから私はそうしますlet t5 = insert 12 t2
、そして私は得t3 = (10, (5, Leaf, Leaf), (15, Leaf, Leaf))
ます。変数を与えましょうc2 to the child node (5, Leaf, Leaf)
だから私の質問はc1 == c2
?t2 と t3の 2 つ(5, Leaf, Leaf)
の はまったく同じですか?