红黑树比较器[关闭]

问题描述 投票:0回答:0

我正在解决一个问题,使用红黑树,在任务中我们需要按两个指标排序,最初我们按第一个标准排序,但如果两个元素的第一个标准相同,则按元素的 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);
       }
   }

c++ algorithm tree red-black-tree
© www.soinside.com 2019 - 2024. All rights reserved.