This repository has been archived by the owner on Feb 7, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFat_Node_Tree.cpp
75 lines (75 loc) · 2.04 KB
/
Fat_Node_Tree.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
class FatNode {
public:
int key;
int size;
FatNode* left;
FatNode* right;
FatNode(int k) : key(k), size(1), left(nullptr), right(nullptr) {}
};
class FatNodeTree {
private:
FatNode* root;
FatNode* insert(FatNode* node, int key) {
if (!node) {
return new FatNode(key);
}
node->size++;
if (key < node->key) {
node->left = insert(node->left, key);
} else {
node->right = insert(node->right, key);
}
return node;
}
int kthSmallest(FatNode* node, int k) const {
if (!node) {
return -1;
}
int leftSize = (node->left) ? node->left->size : 0;
if (k == leftSize + 1) {
return node->key;
} else if (k <= leftSize) {
return kthSmallest(node->left, k);
} else {
return kthSmallest(node->right, k - leftSize - 1);
}
}
int rank(FatNode* node, int key) const {
if (!node) {
return -1;
}
if (key == node->key) {
return (node->left) ? node->left->size + 1 : 1;
} else if (key < node->key) {
return rank(node->left, key);
} else {
int rightRank = rank(node->right, key);
return (rightRank != -1) ? rightRank + ((node->left) ? node->left->size + 1 : 1) : -1;
}
}
public:
FatNodeTree() : root(nullptr) {}
void insert(int key) {
root = insert(root, key);
}
int kthSmallest(int k) const {
return kthSmallest(root, k);
}
int rank(int key) const {
return rank(root, key);
}
};
int main() {
FatNodeTree fatNodeTree;
fatNodeTree.insert(50);
fatNodeTree.insert(30);
fatNodeTree.insert(70);
fatNodeTree.insert(20);
fatNodeTree.insert(40);
fatNodeTree.insert(60);
fatNodeTree.insert(80);
std::cout << "3rd smallest element: " << fatNodeTree.kthSmallest(3) << std::endl;
std::cout << "Rank of 40: " << fatNodeTree.rank(40) << std::endl;
return 0;
}