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
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
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
↑ sambick:
no když si uvědomíš vlastnosti binárního stromu tak to musí fungovat:
// 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)
Offline
↑ 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
↑ 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
Offline
↑ 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