我正在解决一个问题,使用红黑树,在任务中我们需要按两个指标排序,最初我们按第一个标准排序,但如果两个元素的第一个标准相同,则按元素的 id 排序(优先级最小的 id)。我不完全明白如何为此实现比较器。因为在我的实现中,在子树的左侧,一切都按照我的预期实现(也许我错了),但在左侧,可能会出现第一个指标一切都将完美实现的情况,但第二个,最大元素可能不具有最小 id。 完整代码:https://pastebin.com/LAxBQfkw
struct DataCenter {
long long id;
long long countAliveServers;
long long countRestarts;
...
}
static bool compare(DataCenter &dc1, DataCenter &dc2) {
if (dc1.countAliveServers * dc1.countRestarts < dc2.countAliveServers * dc2.countRestarts) {
return true;
} else if (dc1.countAliveServers * dc1.countRestarts > dc2.countAliveServers * dc2.countRestarts) {
return false;
} else {
return dc1.id < dc2.id;
}
}
void insert(DataCenter key) {
NodePtr node = new Node;
node->parent = nullptr;
node->dataCenter = key;
node->left = TNULL;
node->right = TNULL;
node->color = true;
NodePtr y = nullptr;
NodePtr x = this->root;
while (x != TNULL) {
y = x;
if (compare(node->dataCenter, x->dataCenter)) {
x = x->left;
} else {
x = x->right;
}
}
node->parent = y;
if (y == nullptr) {
root = node;
} else if (compare(node->dataCenter, y->dataCenter)) {
y->left = node;
} else {
y->right = node;
}
if (node->parent == nullptr) {
node->color = false;
return;
}
if (node->parent->parent == nullptr) {
return;
}
insertFix(node);
}
void deleteNodeHelper(NodePtr node, DataCenter &key) {
NodePtr z = TNULL;
NodePtr x, y;
while (node != TNULL) {
if (node->dataCenter == key) {
z = node;
}
if (compare(node->dataCenter, key)) {
node = node->right;
} else {
node = node->left;
}
}
...
if (y_original_color == 0) {
deleteFix(x);
}
}