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