Skip to content

Commit e27cbdc

Browse files
authored
Merge pull request #14 from spbu-coding-2023/Treap
Treap
2 parents 8e4f329 + 177dfc9 commit e27cbdc

File tree

3 files changed

+407
-0
lines changed

3 files changed

+407
-0
lines changed
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
package treeLib.bintrees
2+
3+
import treeLib.bintrees.interfaces.BinTree
4+
import treeLib.nodes.TreapNode
5+
import java.util.*
6+
7+
class Treap<K : Comparable<K>, V: Comparable<V> > : BinTree<K, V, TreapNode<K, V>>() {
8+
override var root: TreapNode<K, V>? = null
9+
override var amountOfNodes = 0
10+
private var subTree = PriorityQueue<TreapNode<K, V>>(compareByDescending { it.value })
11+
12+
13+
fun collectNodes(node: TreapNode<K, V>) {
14+
subTree.add(node)
15+
if(node.right != null) node.right?.let{ collectNodes(it) }
16+
if(node.left != null) node.left?.let{ collectNodes(it) }
17+
}
18+
19+
fun buildSubTree(): TreapNode<K, V>? {
20+
val baum = Treap<K, V>()
21+
for(node in subTree) baum.add(node.key, node.value)
22+
subTree.clear()
23+
return baum.root()
24+
}
25+
26+
fun isThereSuckKey(key: K): TreapNode<K, V>? {
27+
var curNode = root
28+
29+
while(curNode != null){
30+
curNode.let{
31+
if(it.key < key) curNode = it.right
32+
else if(it.key > key) curNode = it.left
33+
else return curNode
34+
}
35+
}
36+
37+
38+
return curNode
39+
}
40+
41+
override fun remove(key: K): V? {
42+
val curNode = isThereSuckKey(key) ?: return null
43+
var parent: TreapNode<K, V>? = null
44+
root?.let { parent = findParent(it, it, curNode) }
45+
46+
var count = 0
47+
if(curNode.left != null) count++
48+
if(curNode.right != null) count++
49+
50+
51+
if(count == 0) {
52+
if(curNode == root) root = null
53+
else if(parent?.right == curNode) parent?.right = null
54+
else parent?.left = null
55+
}
56+
57+
else if(count == 1) {
58+
if(curNode == root) root = root?.right ?: root?.left
59+
else if(parent?.right == curNode) parent?.right = curNode.right ?: curNode.left
60+
else parent?.left = curNode.right ?: curNode.left
61+
}
62+
63+
else if(count == 2) {
64+
curNode.right?.let { collectNodes(it) }
65+
curNode.left?.let { collectNodes(it) }
66+
val result = buildSubTree()
67+
if(curNode == root) root = result
68+
else if(parent?.right == curNode) parent?.right = result
69+
else parent?.left = result
70+
}
71+
72+
73+
return null //Why return anything else?
74+
}
75+
76+
override fun add(key: K, priority: V): TreapNode<K, V>? {
77+
if(isThereSuckKey(key) != null) return null
78+
val newNode = TreapNode(key, priority)
79+
80+
if(root == null) {
81+
root = newNode
82+
amountOfNodes += 1
83+
84+
return root
85+
}
86+
87+
var parent: TreapNode<K, V>? = null
88+
root?.let { parent = findParent(it, it, newNode) }
89+
90+
parent?.let{
91+
if(it.key < key) {
92+
if(it.right == null) it.right = newNode
93+
else {
94+
newNode.right = it.right
95+
collectNodes(newNode)
96+
it.right = buildSubTree()
97+
}
98+
}
99+
100+
else if(it.key > key)(
101+
if(it.left == null) it.left = newNode
102+
else{
103+
newNode.left = it.left
104+
collectNodes(newNode)
105+
it.left = buildSubTree()
106+
}
107+
)
108+
109+
else {
110+
newNode.right = root
111+
collectNodes(newNode)
112+
root = buildSubTree()
113+
}
114+
115+
amountOfNodes += 1
116+
117+
return newNode
118+
}
119+
120+
121+
return root
122+
}
123+
124+
125+
fun findParent(curNode: TreapNode<K, V>, parent: TreapNode<K, V>, node: TreapNode<K, V>): TreapNode<K, V>{
126+
if(curNode.value <= node.value) {
127+
if(curNode == parent && node != root) return node
128+
return parent
129+
}
130+
131+
if(curNode.key > node.key) return findParent(curNode.left ?: return curNode, curNode, node)
132+
else if(curNode.key < node.key) return findParent(curNode.right ?: return parent, curNode, node)
133+
else return curNode
134+
}
135+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package treeLib.nodes
2+
3+
class TreapNode<K : Comparable<K>, V: Comparable<V>>(
4+
key: K,
5+
value: V,
6+
right: TreapNode<K, V>? = null,
7+
left: TreapNode<K, V>? = null
8+
) : TreeNode<K, V, TreapNode<K, V>>(key, value, right, left)

0 commit comments

Comments
 (0)