好的,我在OCaml中編寫了一個binary search tree
。在OCaml中構建二進制搜索樹的正確方法
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
上面的代碼被說成是良好的The right way to use a data structure in OCaml
但是,我發現了一個問題。這insert
一氣呵成建設從列表中BST時,如
let rec set_of_list = function
[] > empty
| x :: l > insert x (set_of_list l);;
因此,如果我們從列表中不斷構建BST,沒問題,我們可以得到它具有所有節點的一個完整的BST只會工作列表。
但是,如果我以前已經建立了一個BST,現在我要插入一個節點,然後將得到的BST不會有完整的節點從以前的樹,對嗎?
那麼我應該如何在OCaml中編寫一個bst,以便我們用前一棵樹中的所有節點創建一個新的bst以保持前一棵樹不變?如果每次我需要從舊的bst複製所有節點,是否會影響性能?
編輯:
所以我們可以說最初,一個BST與一個節點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中的兩個(5, Leaf, Leaf)
完全一樣嗎?
不應該有在列表和代碼中的第二次調用其他地方,插入一個新值插入第二個項目的通話之間的差異。插入x old_tree應該返回新的樹。 – stonemetal
您是否嘗試過並且失敗了,或者您在猜測? – molbdnilo
我不明白你問的是什麼問題。 「那麼由此產生的bst將不會有前一棵樹的完整節點,我是對的」 - >我不明白你想在這句話中說些什麼,但是你必須知道新的BST將與它共享所有的節點除了那些在新節點路徑上的節點(新BST中的指針將具有與舊節點中的指針相同的值),所以沒有節點的副本。 – Thomash