Differences

This shows you the differences between two versions of the page.

Link to this comparison view

sd-ca:laboratoare:lab-08 [2020/04/24 13:11]
teodor_stefan.dutu Exercițiul 2 - 313CAb
sd-ca:laboratoare:lab-08 [2024/04/26 03:05] (current)
radu.nichita [Exerciții]
Line 1: Line 1:
-====== Laborator 8 - Arbori și Arbori Binari ======+====== Laborator 8 - Arbori Binari ======
  
-Responsabili +Responsabili: 
-    * [[mailto:alexcosmin.mihai@gmail.com|Alexandru-Cosmin Mihai]] +  * [[mailto:popaiarina13@gmail.com|Iarina-Ioana Popa]] 
-    * [[mailto:doringeman@gmail.com|Dorin-Andrei ​Geman]]+  * [[mailto:andreipirlea03@gmail.com|Andrei ​Pîrlea]]
  
 ===== Obiective ===== ===== Obiective =====
Line 54: Line 54:
     /* root of the tree */     /* root of the tree */
     b_node_t *root;     b_node_t *root;
 +    ​
 +    /* size of the data contained by the nodes */
 +    size_t data_size;
 }; };
 </​code>​ </​code>​
  
 Structura nodului de mai sus este clară: Structura nodului de mai sus este clară:
-*pointer către fiul stâng +  ​* pointer către fiul stâng 
-*pointer către fiul drept +  * pointer către fiul drept 
-*pointer către date+  * pointer către date
  
-<note important>​ +Pentru ​a ne reaminti cum alocăm/dealocăm memorie
-Pentru ​toți membrii unui nod, trebuie să alocăm memorie **dinamic**, dar **doar*atunci când avem nevoie de ea.+<code c> 
 +/** 
 + Creates a new binary tree 
 + @data_size: size of the data contained by the tree's nodes 
 + @return: pointer to the newly created tree 
 + *
 +b_tree_t ​*b_tree_create(size_t data_size);
  
-De asemenea, dealocarea memoriei se va face recursiv, dar numai atunci cand este **necesar**. +/** 
-</note>+ * Clear the whole memory used by the tree and its nodes 
 + * @b_tree: the binary tree to be freed 
 + * @free_data: function used to free the data contained by a node 
 + */ 
 +void b_tree_free(b_tree_t *b_tree, void (*free_data)(void ​*)); 
 +</code>
  
-Pentru a ne reaminti cum alocăm memorie:+De exemplu, dacă dorim să creem un arbore binar ce conține elemente de tip *char*, codul arată astfel:
 <code c> <code c>
-b_tree_t *binary_tree;+b_tree_t *char_tree = b_tree_create(sizeof(char));
  
-binary_tree = b_tree_create();​ +b_tree_free(char_tree, free);
-b_tree_free(binary_tree);+
 </​code>​ </​code>​
 ==== Parcurgerea arborilor ==== ==== Parcurgerea arborilor ====
Line 79: Line 92:
 Se implementeaza foarte usor recursiv: Se implementeaza foarte usor recursiv:
  
-==== Preordine ====+==== 1. Preordine ====
   *Se parcurge **rădăcina**   *Se parcurge **rădăcina**
   *Se parcurge subarborele **stâng**   *Se parcurge subarborele **stâng**
   *Se parcurge subarborele **drept**   *Se parcurge subarborele **drept**
  
-==== Inordine ====+==== 2. Inordine ====
  
   *Se parcurge subarborele **stâng**   *Se parcurge subarborele **stâng**
Line 92: Line 105:
 Exemplu: Exemplu:
 <code c> <code c>
-static ​void __b_tree_inorder(b_node_t *root) +void b_tree_print_inorder(b_node_t *b_node, void (*print_data)(void *)) { 
-+    if (!b_node)
-    if (root == NULL)+
         return;         return;
  
-    ​__b_tree_inorder(root->​left);​ +    ​b_tree_print_inorder(b_node->left, print_data); 
-    ​/* process root */ +    ​print_data(b_node->data); 
-    __b_tree_inorder(root->right); +    ​b_tree_print_inorder(b_node->right, print_data);
-+
- +
-void b_tree_inorder(b_tree_t *tree) +
-{ +
-    ​__b_tree_inorder(tree->root);+
 } }
 </​code>​ </​code>​
-==== Postordine ====+==== 3. Postordine ====
  
   *Se parcurge subarborele **stâng**   *Se parcurge subarborele **stâng**
Line 113: Line 120:
   *Se parcurge **rădăcina**   *Se parcurge **rădăcina**
  
-==== Lățime ====+==== 4. Lățime ====
  
 Se folosește o coadă, iar la fiecare pas se extrage din această coadă câte un nod și se adăugă înapoi în coadă nodul stâng, respectiv drept al nodului scos. Acest algoritm continuă până când coada devine goală. Se folosește o coadă, iar la fiecare pas se extrage din această coadă câte un nod și se adăugă înapoi în coadă nodul stâng, respectiv drept al nodului scos. Acest algoritm continuă până când coada devine goală.
Line 175: Line 182:
 ===== Schelet ===== ===== Schelet =====
  
 +<note important>​
 +Daca folositi **Github Classroom**,​ va rugam sa va actualizati scheletul cu cel de mai jos. Cel din repo-ul clonat initial nu este la cea mai recenta versiune.
 +</​note>​
  
-{{:​sd-ca:​laboratoare:​lab_8:lab08.zip|}} +{{:​sd-ca:​laboratoare:​lab8_2022.zip|Scheletul de laborator}}
- +
- +
-<​hidden>​ +
-{{:​sd-ca:​laboratoare:​lab_8:​lab8skel.zip|Schelet}} +
- +
-https://​drive.google.com/​open?​id=1mCiLKlUPNAJORs5ebGDi0GK-M3kPJ2wQ +
- +
-{{:​sd-ca:​laboratoare:​lab_8:​lab8skel.zip|Schelet}} +
- +
-</​hidden>​+
  
  
 ===== Exerciții ===== ===== Exerciții =====
-1) [**4p**] Implementați,​ compilați si testați funcțiile din //​**binary_tree.c**//​. 
- 
-Inserarea se va face recursiv, pe prima poziție liberă găsită. 
- 
-**313CAa**) [**3p**] Fiind dat un număr natural n, afişaţi toate nodurile de pe nivelul n din arbore. 
  
 <​note>​ <​note>​
-Folosiți check.py pentru a vă testa soluțiileUn task ce nu obține punctaj maxim NU se consideră corect! +Trebuie să vă creați cont de [[https://​lambdachecker.io | Lambda Checker]], dacă nu v-ați creat deja, pe care îl veți folosi la SD pe toată durata semestrului. Aveti grija sa selectati contestul corect la submit, si anume **[[https://​beta.lambdachecker.io/​contest/​75/​problems |Laborator 8 SD]]**
- +
-Veți avea nevoie de Python3 pentru a rula checker-ul. Acesta este instalat by default ​pe versinile recente de Ubuntu.+
 </​note>​ </​note>​
  
-<​hidden>​ +1) [**4p**] Implementarea ​arborelui binar. ​Problema ​**SD-CA-LAB-08-Binary-Tree** pe LambdaChecker.
- +
-**311CAa**) [**3p**] Calculați înălțimea ​arborelui+
- +
-</​hidden>​ +
- +
-**311CAb**) [**3p**] Verificați dacă toate frunzele din arbore se află pe același nivel. +
- +
-**312CAb**) [**3p**] Verificați dacă arborele este echilibrat. +
- +
-**313CAb**) [**3p**] Se dau două noduri A şi B din acelaşi arbore. Determinaţi cel mai jos strămoş comun al celor două noduri (LCA). +
- +
-<​hidden>​ +
- +
-**312CAa**) [**3p**] Fiind dat un arbore ​binar ale cărui noduri reţin valori integer, verificați dacă valoarea din fiecare nod este egală cu suma valorilor copiilor săi. +
- +
-**314CAa**) [**3p**] Afișați toate drumurile de sumă maximă din rădăcină până într-una dintre frunze. +
-</​hidden>​ +
- +
-**315CAa**) [**3p**] Găsiți un subarbore cu suma nodurilor maximă. +
- +
- +
- +
-**314CAb**) [**3p**] Un arbore binar complet este un arbore binar în care fiecare nivel, cu posibila excepţie a ultimului nivel, este plin de noduri. Cu alte cuvinte, fiecare nivel este “umplut” de la stânga la dreapta cu noduri, iar ultimul nivel poate să nu fie umplut până la capăt. +
-Fiind dat un arbore binar, determinaţi dacă acesta este complet.+
  
-**315CAb**) [**3p**] ​Fiind dat un arbore binar ale cărui noduri reţin valori integer, verificaţi dacă pentru fiecare nod din arbore este adevărat faptul că valoarea sa este mai mare decât valoarea copilului stâng şi mai mică decât valoarea copilului drept.+2) [**3p**] ​O problema **aleasa de catre asistent** ​din cele ramase.
  
 +3) [**Bonus**] 1p bonus pe fiecare problema (easy sau medium) in plus pe care o rezolvati, maxim 2p bonus pentru o problema **easy** si una **medium** sau 2 **medium**.
  
 ===== Interviu ===== ===== Interviu =====
sd-ca/laboratoare/lab-08.1587723090.txt.gz · Last modified: 2020/04/24 13:11 by teodor_stefan.dutu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0