BST с рекурсией и заданными структурами

Мне нужно закодировать некоторые методы для BST, и у меня есть некоторые проблемы, позвольте мне объяснить.

У меня есть следующие структуры:

struct node {
    struct node *lChild; 
    struct node *rChild; 
    int value; 
};

а также

struct tree {
    struct node *root;
};

наряду со следующими функциями:

struct tree* constructNewTree()
{
    struct tree *T=malloc(sizeof(struct tree));
    T->root=NULL;

    return T;
}

а также

struct node* constructNewNode(int i)
{
    struct node *N=malloc(sizeof(struct node));
    N->value=i;
    N->lChild=NULL;
    N->rChild=NULL;

    return N;
}

И в моем основном я должен назвать это (например):

int main()
{
    struct tree *T;
    T=constructNewTree();

    insertKey(5,T);
    insertKey(2,T);
    insertKey(9,T);
    return 0;
}

Что мне нужно сделать, так это создать функцию insertKey(int i, struct tree *T), используя рекурсию.

Я хотел сделать что-то вроде

void insertKey(int i, struct tree *T)
{
    if (T->root==NULL) {
        T->root=constructNewNode(i);
        return;
    }
    else {
        if (i<=T->root->value) {
            T->root->lChild=constructNewNode(i);
        else if (i>T->root->value) {
            T->root->rChild=constructNewNode(i);
        }
    }
}

Но это не очень далеко, использование рекурсии позволило бы мне снова вызвать insertKey, но я не могу использовать узел и дерево одинаково.

Кто-нибудь знает, как я могу это сделать, не изменяя данные структуры?

Большое спасибо.


person Sword22    schedule 20.03.2011    source источник
comment
Мне это кажется домашним заданием. Теги обновлены соответствующим образом.   -  person BMitch    schedule 20.03.2011


Ответы (1)


Ваш insertKey принимает дерево в качестве аргумента. Дерево — это всего лишь указатель на самую вершину.

Я рекомендую вам написать функцию insertKey, которая принимает Node в качестве аргумента. Также в этой функции вы должны проверить, есть ли другое дерево у левого/правого дочернего элемента.

В настоящее время вы просто создаете новый узел независимо от того, что там есть. Это перезапишет все предыдущие вставки.

person Starkey    schedule 20.03.2011
comment
Спасибо, но не испортит ли это код main() ? Может быть, мне следует создать другую функцию insertNode, которая делает то же самое, но с узлами, а затем в insertKey проверить, пуст ли T-›root, если нет, использовать insertNode с T-›root в качестве аргумента? - person Sword22; 20.03.2011
comment
+1 Это правильный способ сделать это. Теперь дайте Старки +15, чтобы мы могли двигаться дальше :) - person ralphtheninja; 20.03.2011
comment
Просто последний вопрос, прежде чем я это сделаю, для других методов, которые мне нужно кодировать, например, findKey (int i, struct tree *T) или deleteKey (int i, struct tree *T), одна и та же проблема будет возникать каждый раз, если Я поступаю так же? - person Sword22; 20.03.2011
comment
Да, ты должен. Вы всегда должны просто передавать структуру узла для аргументов, а не дерево. Честно говоря, я не знаю, почему у вас есть отдельная структура для дерева, потому что это действительно просто узел. - person Starkey; 21.03.2011
comment
Это было дано так, я не знаю, почему. Все равно большое спасибо ;) - person Sword22; 21.03.2011