Skip to content

Commit 67f1dfa

Browse files
committed
preparing for later changes
1 parent 8e4f329 commit 67f1dfa

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package treeLib.bintrees.interfaces
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 val priorQ = PriorityQueue<TreapNode<K, V>>(compareByDescending { it.value })
11+
12+
13+
//Получив родителя и найдя куда он идёт, мы связываем и передаём сюда
14+
//Он должен здесь дойти до него по обычной итерации дерева
15+
//и параллельно должно менять maxLim и minLim, по этому мы составим новый массив
16+
//и начнём строить дерево с нуля где node это корень
17+
fun rebuildTree(node: TreapNode<K, V>) {
18+
var maxLim: TreapNode<K, V>? = root
19+
var minLim: TreapNode<K, V>? = root
20+
var curRoot = root
21+
var reachedNode = false
22+
for (curNode in priorQ){
23+
if(reachedNode == false) {
24+
if (curNode.value > curRoot?.value ?: curNode.value) { //N_U_L_L-S_A_F_E_T_Y
25+
minLim = curRoot
26+
curRoot = curNode?.right // Тут надо подумать
27+
} else if (curNode.value < curRoot?.value ?: curNode.value) {//N_U_L_L-S_A_F_E_T_Y
28+
maxLim = curRoot
29+
curRoot = curNode?.left
30+
} else reachedNode = true
31+
}
32+
else {
33+
34+
}
35+
}
36+
}
37+
38+
override fun remove(key: K): V? {
39+
if(root == null) return null
40+
if(root?.key == key && amountOfNodes == 1) {
41+
priorQ.remove(root)
42+
amountOfNodes -= 1
43+
root = null
44+
}
45+
return null
46+
}
47+
48+
override fun add(key: K, priority: V): TreapNode<K, V>? {
49+
if(root == null) {
50+
root = TreapNode(key, priority)
51+
amountOfNodes += 1
52+
priorQ.add(root)
53+
return root
54+
}
55+
56+
//Должны вызвать функцию X, отработать случаи когда куда добавляется новый ключ
57+
//у нас нету ничего
58+
//и далее работать в rebuildTree со случаями, когда там что-то всё ж имеется
59+
//потому что она так и задумана, что применяется, когда нужно перестроить поддерево
60+
//А ежли его нету, то и перестраивать ничего не надо
61+
62+
return root
63+
}
64+
65+
66+
//Здесь мы находим родителя нашего нового ключа
67+
//А далее по значению ключа(больше иль меньше родителя) выясняем куда оно идёт
68+
//и работаем исходя из этого
69+
fun x(curNode: TreapNode<K, V>, parent: TreapNode<K, V>, node: TreapNode<K, V>): TreapNode<K, V>{
70+
if(curNode.value < node.value) {
71+
if(curNode.key < node.key) {
72+
//We need to rebuild and build new tree with node.key as a root
73+
//Иль попытайся придумать что-то со списками
74+
}
75+
}
76+
if(curNode.key > node.key) {
77+
//if(curNode.left == null) return parent
78+
return x(curNode.left ?: return parent, curNode, node)
79+
}
80+
else if(curNode.key < node.key) {
81+
//if(curNode.right == null) return parent
82+
return x(curNode.right ?: return parent, curNode, node)
83+
}
84+
else return curNode
85+
}
86+
}
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, priority, right, left)

0 commit comments

Comments
 (0)