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 23. 01. 2011 14:53 — Editoval sazec (23. 01. 2011 14:57)

sazec
Příspěvky: 42
Reputace:   
 

C - Binarni stromy

Ahoj potreboval bych od nekoho kdo se v nich dobre vyzna aby mi zkontroloval zda reseni techto problemu je spravne diky :)

1.Smazte vsechny uzly v binarnim stromne pod urovni “depth”

Code:

delBelow(TNODE * root, int depth){
if(!root)
    return 0;
if(!root->m_L && !root->m_R)
    return 0;
if(depth < 1){
free(root->m_L);
free(root->m_R);
root->m_L = NULL;
root->m_R = NULL;
}
if(root->m_L) delBelow(root->m_L, depth - 1);
if(root->m_R) delBelow(root->m_R, depth - 1);
}

2.Realizujte funkci sumLeaves, která sečte hodnoty (uložené v proměnné m_Data) listů, které neukazují na žádný další list, (nejnižších úrovní každé cesty) v binárního stromu předaném ukazatelem na jeho kořen.

Code:

int sumLeaves(TNODE *root){
if(!root)
    return 0;
if(root->m_L || root->m_R){
return sumLeaves(root->m_L) + sumLeaves(root->m_R)
}
Return root->m_Data;
}

3.Realizujte funkci, která pro zadaný kořen stromu vypočte počet listových uzlů.

Code:

int countLeaves(TNODE *root) {
if(!root)
    return 0;
if(!root->m_L && !root->m_R)
    return 0;
if(!root->m_L){
return 1 + countLeaves(m_R);
}
if(!root->m_R){
return 1 + countLeaves(m_L);
}
return 2 + countLeaves(m_L)+ countLeaves(m_R);
}

4.Realizujte funkci CntInner, která pro zadaný kořen stromu vypočte počet vnitrnich uzlů. - tzn krom listu

Code:

int CntInner(TNODE *root){
if(!root)
    return 0;
if(!root->m_L && !root->m_R)
    return 0;
return 1 + CntInter(root->m_R) + CntInter(root->m_L)
}

5. Spocitat pocet uzlu pouze s jednim potomkem.

Code:

int CntOneChild(TNODE *root){
if(!root)
    return 0;
if(!root->m_L && !root->m_R)
    return 0;
if(root->m_L && !root->m_R)
    return 1 + CntOneChild(root->m_L);
if(root->m_L && !root->m_R)
    return 1 + CntOneChild(root->m_R);
return CntOneChild(root->m_R) + CntOneChild(root->m_L);
}

Offline

  • (téma jako vyřešené označil(a) sazec)

#2 23. 01. 2011 17:55 — Editoval Lumikodlak (23. 01. 2011 17:57)

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: C - Binarni stromy

U toho prvniho problemu by se mi zdalo korektnejsi ty dva posledni radky presounout pred to nulovani, takhle:

Code:

if(root->m_L) delBelow(root->m_L, depth - 1);
if(root->m_R) delBelow(root->m_R, depth - 1);
if(depth < 1){
free(root->m_L);
free(root->m_R);
root->m_L = NULL;
root->m_R = NULL;
}

Tak jak to mas, tak ti tam budou zustavat alokovane ty dalsi vetve ve vetsi hloubce jestli se nepletu (Protoze tim ze vynulujes m_L a m_R, tak delBelow se uz nezavola pro ty dalsi).

Offline

 

#3 23. 01. 2011 18:04

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: C - Binarni stromy

Ten 3 - Je pravda, ze listovy uzel je uzel, ktery nema dalsi potomky? Jestli ano, tak bych rekl, ze pro pripad if(!root->m_L && !root->m_R) by se mela vratit hodnota 1 (a ne 0), a v tech dalsi pripadech nepricitat 1 a 2, protoze v tech pripadech ten koren samotny neni listovym uzlem.

Offline

 

#4 23. 01. 2011 18:06 — Editoval sazec (23. 01. 2011 18:10)

sazec
Příspěvky: 42
Reputace:   
 

Re: C - Binarni stromy

jj diky to mi dava smysl :) (tvuj prvni prispevek)
A ta trojka myslim ze je to myslene tak ze je to uzel na kterem visi uz jen listy ale ne dalsi uzel, pro to by to snad mnelo byt dobre tusim.

Offline

 

#5 23. 01. 2011 18:10

Lumikodlak
Místo: Praha
Příspěvky: 212
Pozice: Programator nebo tak neco :-)
Reputace:   19 
 

Re: C - Binarni stromy

U toho 5 - tam jsi nejspis zkopiroval tu podminku, ale uz ji neupravil, takze tam mas dve stejne:

Code:

if(root->m_L && !root->m_R)
    return 1 + CntOneChild(root->m_L);
if(root->m_L && !root->m_R)
    return 1 + CntOneChild(root->m_R);

Spis by tam melo byt neco jako:

Code:

if(root->m_L && !root->m_R)
    return 1 + CntOneChild(root->m_L);
if(!root->m_L && root->m_R)
    return 1 + CntOneChild(root->m_R);

Mozna jsou i chyby jinde, mozna se naopak pletu a chyby tam nemas, akorat jsem psal navrhy na mista, ktera by se dala zkontrolovat :-)

Offline

 

#6 23. 01. 2011 18:13

sazec
Příspěvky: 42
Reputace:   
 

Re: C - Binarni stromy

Ano u te petky jsem se preklikl asi. Jinak jsem vdecny za kazdy postrceni k reseni :)

Offline

 

#7 25. 01. 2011 19:27

sazec
Příspěvky: 42
Reputace:   
 

Re: C - Binarni stromy

Mam jeste jeden orisek se kterym si nevim rady. Mam zadany nesetrideny binarni strom a mam najit nejmensi hodnotu listu a tu z dane funkce vratit.
Uloha se ma resit bez globalnich promenych. Na nic nemuzu prijit, jinak funkce ma mit hlavicku  int minLeaf(BNODE *root)
Diky za kazde postrceni

Offline

 

#8 25. 01. 2011 19:37 — Editoval pizet (25. 01. 2011 19:40)

pizet
Místo: Levice/Praha
Příspěvky: 459
Reputace:   11 
 

Re: C - Binarni stromy

Nebolo by jednoducho prejsť strom do hĺbky trebárs. Zamysli sa, že vtedy vieš kedy prídeš do listu. A jednoducho zo všetkých listov si vybrať ten, ktorý má najmenšiu hodnotu.

Prejsť do hĺbky sa dá jednoducho, rekurzívne (kód je z knihy Algoritmy a programovací techniky):

Code:

procedure Pruchod1(U: Uk);
  {pruchod binarnim stromem do hloubky pomoci rekurze.
   U je ukazatel na koren zkoumaneho stromu}
  begin
  if U <> nil then
    begin
    writeln(U^.Info);      {nebo jina akce s uzlem U}
    Pruchod1(U^.L);
    Pruchod1(U^.P)
    end
  end;  {procedure Pruchod1}

Časová zložitosť je O(n), kde n je počet vrcholov.


Do you follow my way? Or you just see a black stain swimming in the Milky Way ...
KSP je určený pre študentov základných a stredných škôl, ktorí majú záujem naučiť sa niečo z oblasti algoritmov, logických úloh, programovania a informatiky.

Offline

 

#9 25. 01. 2011 19:45

sazec
Příspěvky: 42
Reputace:   
 

Re: C - Binarni stromy

ahoj, no do hloubky se dostanu a najdu dane listy, ale jak zjistim ktery z danych listu to je. Kazdy list prece muze byt v jine hloubce. A navic cele to musi byt ve funkci ktera ma parametr jenom (BNODE * root) ? Mozna ze se ptam hloupe ale nedochazi mi to..

Offline

 

#10 25. 01. 2011 19:47 — Editoval pizet (25. 01. 2011 19:50)

pizet
Místo: Levice/Praha
Příspěvky: 459
Reputace:   11 
 

Re: C - Binarni stromy

Mam zadany nesetrideny binarni strom a mam najit nejmensi hodnotu listu a tu z dane funkce vratit.

Ja som pochopil, že ty máš nájsť list ktorý má najmenšiu hodnotu zo všetkých listov, je to tak?

Ak áno, tak potom to nemá nič spoločné s tým, že v akej hĺbke ten list je.


Do you follow my way? Or you just see a black stain swimming in the Milky Way ...
KSP je určený pre študentov základných a stredných škôl, ktorí majú záujem naučiť sa niečo z oblasti algoritmov, logických úloh, programovania a informatiky.

Offline

 

#11 25. 01. 2011 19:50 — Editoval sazec (25. 01. 2011 19:52)

sazec
Příspěvky: 42
Reputace:   
 

Re: C - Binarni stromy

Ano je to tak, mam najit list s nejmensi hodnotou a tu vratit.

Dobre asi to neni dulezite ta hloubka, ale jak teda poznam ktery z danych listu to je ??

Offline

 

#12 25. 01. 2011 19:53

pizet
Místo: Levice/Praha
Příspěvky: 459
Reputace:   11 
 

Re: C - Binarni stromy

Však si proste dáš nejakú premennú, ktorej priradíš konštantu "nekonečno". A vždy keď narazíš na hodnotu, ktorá je menšia ako hodnota premennej, tak si zapamätáš novú najmenšiu hodnotu. A spravíš to len ak si v liste.


Do you follow my way? Or you just see a black stain swimming in the Milky Way ...
KSP je určený pre študentov základných a stredných škôl, ktorí majú záujem naučiť sa niečo z oblasti algoritmov, logických úloh, programovania a informatiky.

Offline

 

#13 25. 01. 2011 19:54

pizet
Místo: Levice/Praha
Příspěvky: 459
Reputace:   11 
 

Re: C - Binarni stromy

No ak je to binárny strom, tak keď sú pointery left a right NULL, tak je to list.


Do you follow my way? Or you just see a black stain swimming in the Milky Way ...
KSP je určený pre študentov základných a stredných škôl, ktorí majú záujem naučiť sa niečo z oblasti algoritmov, logických úloh, programovania a informatiky.

Offline

 

#14 25. 01. 2011 20:02 — Editoval sazec (25. 01. 2011 20:03)

sazec
Příspěvky: 42
Reputace:   
 

Re: C - Binarni stromy

jj to vim s tim jak poznam list a tak i to porovnavani ale dejme tomu ze by dany algoritmus vypadal takhle:

Code:

int minLeaf(BNODE *root){
int min = 999;

if(!root){
    return 0;}                                //kontrola jestli je koren
if(root->right || root->left){
               return cntOneChild(root->left) + cntOneChild(root->right);    //projizdeni dalsich uzlu
               }        
    if(!root->right && !root->left){ //najdu list
                  if(root->key < min){//key je dana hodnota listu
min = root->key;
return min;
                          }
                  }    
    }

Nevrati mi to nahodou hodnotu vsech listu, protoze tuto funkci volam vicekrat a kdyz je volana tak promena min bude vzdy znova 999 ?

Offline

 

#15 25. 01. 2011 20:30

pizet
Místo: Levice/Praha
Příspěvky: 459
Reputace:   11 
 

Re: C - Binarni stromy

Nemohol by byť tento pseudokód dobrý?

Code:

int find_min(BNODE *root) {
    int min = INFTY; int x;
    if (root is list) return root->value;
    else {
        if(x=find_min(root->left) < min) min = x;
        if(x=find_min(root->right) < min) min = x;
    }
    return min;
}

Do you follow my way? Or you just see a black stain swimming in the Milky Way ...
KSP je určený pre študentov základných a stredných škôl, ktorí majú záujem naučiť sa niečo z oblasti algoritmov, logických úloh, programovania a informatiky.

Offline

 

#16 25. 01. 2011 21:09

sazec
Příspěvky: 42
Reputace:   
 

Re: C - Binarni stromy

Tak sem lehce poladil tvoje reseni a ozkousel a funguje, diky za postrkovani :)

Code:

int find_min(BNODE * root) {
    int min = sizeof(int); int x=0;
    if (!root->right && !root->left) return root->key;
    else {
    if(root->left && root->right){         
         if(find_min(root->left) < min) min = find_min(root->left);
        if(find_min(root->right) < min) min = find_min(root->right);
}
    if(!root->left && root->right){         
        if(find_min(root->right) < min) min = find_min(root->right);
}
    if(root->left && !root->right){         
         if(find_min(root->left) < min) min = find_min(root->left);
}
    }
    return min;
}

Offline

 

#17 25. 01. 2011 21:24

pizet
Místo: Levice/Praha
Příspěvky: 459
Reputace:   11 
 

Re: C - Binarni stromy

Jasné je to dobre. Však to moje bol len narýchlo napísaný pseudokód. Lepšie je keď si sa k tomu dopracoval sám. Môžeš označiť za vyriešené teda. :)


Do you follow my way? Or you just see a black stain swimming in the Milky Way ...
KSP je určený pre študentov základných a stredných škôl, ktorí majú záujem naučiť sa niečo z oblasti algoritmov, logických úloh, programovania a informatiky.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson