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

голоса
0

Я должен кодировать некоторые методы для 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, структура дерева * 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, но я не могу использовать узел и дерево таким же образом.

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

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

Задан 20/03/2011 в 19:16
источник пользователем
На других языках...                            


1 ответов

голоса
1

Ваш insertKey берет дерево в качестве аргумента. Дерево является только указателем на самом верху.

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

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

Ответил 20/03/2011 в 19:47
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more