diff options
author | Vladimir Azarov <avm@intermediate-node.net> | 2025-05-18 15:23:49 +0200 |
---|---|---|
committer | Vladimir Azarov <avm@intermediate-node.net> | 2025-05-18 15:23:49 +0200 |
commit | be407d29db4f2ac1018ab6841c7111f95b977948 (patch) | |
tree | 80894cf46a3e694218f28773df7f057a922aca59 /tree.sml | |
parent | d289f01594024a8fe64aeed56721260fab6b4e50 (diff) |
#undef
Diffstat (limited to 'tree.sml')
-rw-r--r-- | tree.sml | 40 |
1 files changed, 40 insertions, 0 deletions
@@ -1,6 +1,8 @@ structure Tree: TREE = struct datatype ('k, 'v) t = Node of 'k * 'v * ('k, 'v) t * ('k, 'v) t | Empty + type 'k cmp = 'k -> 'k -> order + val empty = Empty fun insert _ Empty k v = (NONE, Node (k, v, Empty, Empty)) @@ -20,6 +22,44 @@ structure Tree: TREE = struct (res, Node (k', v', left, right)) end + fun delete _ Empty _ = (NONE, Empty) + | delete cmp (Node (k', v', left, right)) k = + case cmp k k' of + LESS => + let + val (res, left) = delete cmp left k + in + (res, Node (k', v', left, right)) + end + | GREATER => + let + val (res, right) = delete cmp right k + in + (res, Node (k', v', left, right)) + end + | EQUAL => ( + case (left, right) of + (Empty, Node _) => (SOME v', right) + | (Node _, Empty) => (SOME v', left) + | (Empty, Empty) => (SOME v', Empty) + | (Node _, Node _) => + let + fun deleteRightmost Empty = raise Unreachable + | deleteRightmost (Node (k, v, left, Empty)) = + ((k, v), left) + | deleteRightmost (Node (k, v, left, right)) = + let + val (p, right) = deleteRightmost right + in + (p, Node (k, v, left, right)) + end + + val ((k, v), left) = deleteRightmost left + in + (SOME v', Node (k, v, left, right)) + end + ) + fun lookup _ Empty _ = NONE | lookup cmp (Node (k', v', left, right)) k = case cmp k k' of |