Skip to content

Commit 93679e4

Browse files
committed
Fix duplicate insertion in treap
1 parent 4dff037 commit 93679e4

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
lines changed

Algorithms.Tests/DataStructures/Treap.fs

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@ type TreapTests () =
88

99
[<TestMethod>]
1010
member this.``Test basic operations``() =
11-
let mutable treap = empty
12-
13-
// Test insertion
14-
treap <- insert 5 treap
15-
treap <- insert 3 treap
16-
treap <- insert 7 treap
11+
let treap =
12+
empty
13+
|> insert 5
14+
|> insert 3
15+
|> insert 7
1716

1817
// Test getKthElement (0-based indexing)
1918
Assert.AreEqual(Some 3, getKthElement treap 0u)
@@ -35,10 +34,11 @@ type TreapTests () =
3534

3635
[<TestMethod>]
3736
member this.``Test deletion``() =
38-
let mutable treap = empty
39-
treap <- insert 5 treap
40-
treap <- insert 3 treap
41-
treap <- insert 7 treap
37+
let mutable treap =
38+
empty
39+
|> insert 5
40+
|> insert 3
41+
|> insert 7
4242

4343
// Delete middle element
4444
treap <- erase 5 treap
@@ -51,6 +51,25 @@ type TreapTests () =
5151
Assert.AreEqual(Some 3, getKthElement treap 0u)
5252
Assert.AreEqual(Some 7, getKthElement treap 1u)
5353

54+
[<TestMethod>]
55+
member this.``Test duplicate insertion``() =
56+
let mutable treap = empty
57+
treap <- insert 3 treap
58+
treap <- insert 5 treap
59+
treap <- insert 1 treap
60+
treap <- insert 3 treap
61+
62+
Assert.AreEqual(Some 1, getKthElement treap 0u)
63+
Assert.AreEqual(Some 3, getKthElement treap 1u)
64+
Assert.AreEqual(Some 5, getKthElement treap 2u)
65+
Assert.AreEqual(None, getKthElement treap 3u)
66+
67+
treap <- erase 3 treap
68+
Assert.AreEqual(Some 1, getKthElement treap 0u)
69+
Assert.AreEqual(Some 5, getKthElement treap 1u)
70+
Assert.AreEqual(None, getKthElement treap 2u)
71+
72+
5473
[<TestMethod>]
5574
member this.``Test order preservation``() =
5675
let mutable treap = empty

Algorithms/DataStructures/Treap.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,11 @@ module Treap =
8282
let updatedRightsLeftChild = merge (Some left) right.LeftChild
8383
right.UpdateLeftChild updatedRightsLeftChild |> Some
8484

85+
// Inserts a new value into the treap, noop if value already exists
8586
let insert (value: int) (treap: Treap) : Treap =
8687
let node = TreapNode.create value
8788
let left, right = split treap.Root value
89+
let _, right = split right (value + 1)
8890
merge (merge left (Some node)) right
8991
|> fun root -> { Root = root }
9092

0 commit comments

Comments
 (0)