BST s rekurze a daných konstrukcí

hlasů
0

Musím kód některé metody pro BST a mám nějaké problémy, dovolte mi to vysvětlit.

Mám následující strukturu:

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

a

struct tree {
    struct node *root;
};

spolu s následujícími funkcemi:

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

    return T;
}

a

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

    return N;
}

A v mém hlavním musím volat to (například):

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

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

To, co musím udělat, je vytvořit funkční insertKey (int i, struct strom * T) s použitím rekurze.

Chtěl jsem udělat něco podobného

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);
        }
    }
}

Ale to není moc daleko, pomocí rekurze by mi umožnilo znovu volat insertKey ale nemohu použít uzel a strom stejným způsobem.

Ví někdo, jak bych mohl udělat, že bez změny dané struktury?

Děkuji mnohokrát.

Položena 20/03/2011 v 19:16
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Váš insertKey trvá strom jako argument. Strom je pouze ukazatel až na samý vrchol.

To, co jsem doporučujeme udělat, je napsat funkci insertKey která vezme uzel pro svůj argument. Také v této funkci, musíte zkontrolovat, zda existuje jiný strom na pravé / levé dítě.

V současné době jste právě postavit nový uzel bez ohledu na to, co tam je. To přepíše všechny předchozí inzerce.

Odpovězeno 20/03/2011 v 19:47
zdroj uživatelem

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