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+ }
0 commit comments