Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 21. 05. 2012 20:59 — Editoval sambick (21. 05. 2012 21:01)

sambick
Zelenáč
Příspěvky: 21
Reputace:   
 

List binarniho stromu

Muzete mi prosim pomoci doresit pridani dalsiho listu do stromu? Neco mi unika,ale nemuzu prijit na to co. Na zacatku j root nastaven na NULL . Podotykam ze prototyp fce je jasne dany a nesmim snim hybat...

STRUKTURY:
typedef struct _TreeNode {
    Variant * data;                /*< Data listu stromu */
    struct _TreeNode * left;    /*< Ukazatel na levý list stromu */
    struct _TreeNode * right;    /*< Ukazatel na pravý list stromu */
} TreeNode;

/*!
* \brief Datová struktura stromu.
*/
typedef struct _Tree {
    TreeNode * root;        /*< Ukazatel na kořen stromu */
    bool delete_contents;    /*< S mazáním uzlu stromu smaž také jeho data */
} Tree;

A SAMOTNA FUNKCE:
bool tree_insert(Tree* tree, Variant* data){
    TreeNode * uk;
    uk = tree->root;
        while( uk != NULL ) //hledani sravneho mista
    {
        if (uk->data->data < data->data)
            uk = uk->left;
        if (uk->data->data > data->data)
            uk = uk->right;
        if (uk->data->data == data->data)
                return false;
    }
        uk = myMalloc(sizeof(TreeNode));    //vytvooení nového uzlu
        uk->right = NULL;          //naplneni hodnotamy
        uk->left = NULL;
        uk->data = data;
// A ted problem
                //tree->root = uk; - kdyz dam toto, prepisuju jenom koren, kdyz to nedam, neprepisuju nic
        return true;
    }

Offline

 

#2 21. 05. 2012 23:29 — Editoval sambick (22. 05. 2012 09:20)

sambick
Zelenáč
Příspěvky: 21
Reputace:   
 

Re: List binarniho stromu

Tak jsem to trosku prepsal, ale dava mi to listy jenom do leva..

bool tree_insert(Tree* tree, Variant* data){
    uk=tree->root;
        if( uk != NULL )
    {
        if (uk->data->data < data->data)
            tree_insert(&uk->left, data);
        if (uk->data->data > data->data)
            tree_insert(&uk->right, data);
        if (uk->data->data == data->data)
                return false;
    }
        uk = myMalloc(sizeof(TreeNode));    //vytvooení nového uzlu
        uk->right = NULL;          //a jeho naplniní správnými hodnotami}
        uk->left = NULL;
        uk->data = data;
        tree->root=uk;
        return true;
    }

Offline

 

#3 24. 05. 2012 08:53 — Editoval ReVolt (24. 05. 2012 08:57)

ReVolt
Příspěvky: 99
Škola: UPOL
Pozice: Student
Reputace:   
Web
 

Re: List binarniho stromu

↑ sambick:
no když si uvědomíš vlastnosti binárního stromu tak to musí fungovat:

Code:

// struct bych na strom nepoužíval, stačí když znáš pointer na kořen
Node *root;

bool tree_insert(Node* root, int data) {
     Node *tn = root;
     // alokace paměti pro nový uzel
     Node new = (Node *)malloc(sizeof(Node));
     new->data = data;
     new->left = NULL;
     new->right = NULL;

     if((&tn)->value > data) {
          if((&tn)->left == NULL) {
               (&tn)->left = new;
               return true;
          }
          else
               tree_insert((&tn)->left, data);
     }
     else {
           if((&tn)->right == NULL) {
               (&tn)->right = new;
               return true;
          }
          else
               tree_insert((&tn)->right, data);
     }
}

když si to upravíš aby ti to sedlo do programu mělo by to fungovat (netestoval jsem, napsal jsem to z fleku :), snad jsem tam nenasekal moc chyb)


http://www.turistickyraj.cz - napsal jsem a spravuji

Offline

 

#4 24. 05. 2012 09:12

sambick
Zelenáč
Příspěvky: 21
Reputace:   
 

Re: List binarniho stromu

↑ ReVolt:

Diky za odpoved, zkusim si s tim pohrat. Struktura je dana ze zadani, s ni nemuzu hybat. Vytahnout si vsak pointer na zacatek neni problem. Jen se divam ze alokujes pamet jeste pred vyhodnocenim mista. Neznamena to, ze se bude alokovat pri kazdem zavolani dalsi pamet? Pokud volas rekurzivne a list bude treba az v hloubce 10, nebude tak alokovano 10 listu, ze kterych se nakonec pouzije jenom jeden?

Offline

 

#5 24. 05. 2012 11:53 — Editoval ReVolt (24. 05. 2012 11:54)

ReVolt
Příspěvky: 99
Škola: UPOL
Pozice: Student
Reputace:   
Web
 

Re: List binarniho stromu

↑ sambick:
jéé no jo, přesně tak, já rekurzi nemám rád, psal jsem to rekurzí protože to tak máš ty, tak si tam dopiš tu podmínku, že dokud list není NULL tak ať se nealokuje, já jsem na to kdysi použil cyklus while


http://www.turistickyraj.cz - napsal jsem a spravuji

Offline

 

#6 24. 05. 2012 12:26

sambick
Zelenáč
Příspěvky: 21
Reputace:   
 

Re: List binarniho stromu

↑ ReVolt:
Jo, to by mohlo projit. Diky :-) Jen jeste osetrit kdyz je list koren tedy root == NULL a pred alokaci dat podminku ze left nebo right jsou NULL a pak teprve vlozit na spravne misto. Vecer to zkusim. Diky!

Offline

 

#7 27. 05. 2012 13:07 — Editoval sambick (27. 05. 2012 13:08)

sambick
Zelenáč
Příspěvky: 21
Reputace:   
 

Re: List binarniho stromu

↑ sambick:
Tak problem byl nakonec v tom ze data->data meli jeste jeden prvek podle typu dat. Takze treba data->data->datalong... Algoritmus v druhem postu je spravny, jen bylo treba osetrit toto...

EDIT: Muze se oznacit jak vyresene..

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson