Обновите код дерева AVL для выполнения поиска ИЛИ вставки

0

Я хотел бы использовать деревья AVL в определенном алгоритме. Я делаю R-пакет, поэтому я хочу придерживаться реализаций C или C++ (в настоящее время используется реализация C).

Я получил базовый код для реализации дерева AVL: http://www.geeksforgeeks.org/avl-tree-set-2-deletion/

Я пытаюсь создать новую функцию, которая будет вставлять новый узел, если ключ не находится в дереве, иначе, если он находится в дереве, дайте мне доступ к узлу, чтобы я мог посмотреть на него. Я программист Noobie C, хотя я сталкиваюсь с несколькими корягами.

Вот моя текущая реализация. В основной функции я вставляю несколько клавиш и печатаю предварительный заказ, чтобы проверить, что вставки работают правильно (они делают). Затем я пытаюсь вставить ключ, который уже находится в дереве. Это приводит к ошибке seg :( может ли кто-нибудь помочь мне? Это, вероятно, просто проблема с моим C:

struct node* specialInsert(struct node* root, struct node* result, int *numBefore, int key, bool *flag){
    //We are inserting a new (non-root) node!
    if (root == NULL){
        struct node* res = newNode(key);
        res->equalCount = key;
        *numBefore = 0;
        *flag = true;
        return(res);
    }else if( key == root->key){
        *flag = false;
        *numBefore = root->leftCount;
        root->equalCount = root->equalCount + key;

        if(result == NULL){
            struct node* result = newNode(root->key);
        }

        //printf("result key is: %d\n", result->key);

        return root;
    }else if( key < root->key){
        root->left = specialInsert(root->left, result, numBefore, key, flag);
        root->leftCount = root->leftCount + key;
        //if(*flag) update(root, key);
        //else return(root->left);
        update(root,key);
    } else if( key > root->key){
        root->right = specialInsert(root->right, result, numBefore, key, flag);
        *numBefore = *numBefore + root->leftCount + root->equalCount;
        root->rightCount = root->rightCount + key;
        //if(*flag) update(root, key);
        //else return(root->right);
        update(root,key);
    }
}
struct node* findOrInsert(struct node* root, struct node* result, int *numBefore, int key){
    bool *flag;
    bool val = false;
    flag = &val;

    /* 1.  Perform the normal BST rotation */
    if (root == NULL){
        struct node* res = newNode(key);
        *numBefore = 0;
        res->equalCount = key;
        return(res);
    }
    else return( specialInsert(root, result, numBefore, key, flag) );


}

и в основной функции у меня есть:

struct node *root2 = NULL;
struct node *result = NULL;

root2 = findOrInsert(root2, result, x, 9);
root2 = findOrInsert(root2, result, x, 5);
root2 = findOrInsert(root2, result, x, 10);
root2 = findOrInsert(root2, result, x, 0);
root2 = findOrInsert(root2, result, x, 6);
root2 = findOrInsert(root2, result, x, 11);
root2 = findOrInsert(root2, result, x, -1);
root2 = findOrInsert(root2, result, x, 1);
root2 = findOrInsert(root2, result, x, 2);


preOrder(root2);
printf("\n");

root2 = findOrInsert(root2, result, x, 9);
printf("Number of elements less than %d: %d\n", result->key,result->leftCount);
Теги:
segmentation-fault
avl-tree

1 ответ

1

Вы можете просто полагаться на код, написанный другими.

Одной из таких реализаций является реализация Boost AVL Trees, к которой вы можете легко получить доступ через CRAN-пакет BH, который дает вам заголовки Boost для использования в R (и C++).

Конечно, вы также можете отладить свою собственную структуру данных, и в этом есть заслуга. В этом случае gdb может оказаться полезным...

  • 3
    Хотелось бы, чтобы на моем плече был свой личный Дирк, чтобы он помогал мне в жизни
  • 0
    Я бы тоже этого хотел ;-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню