Sari la conținut
LECȚIA 17.2 · INFORMATICĂ

Arbori: terminologie și reprezentare

Rădăcină, descendenți, ascendenți, frunze, și cele trei metode de reprezentare.

Ce este un arbore

Un arbore e un graf conex și fără cicluri.

Proprietatea fundamentală: un arbore cu nn noduri are exact n−1n - 1 muchii. Între oricare două noduri există un singur lanț elementar.

Terminologie (arbore cu rădăcină)

  • Rădăcină: nodul de pornire, ales convențional.
  • Descendent: orice nod aflat mai jos pe ramură.
  • Descendent direct (fiu): nodul legat imediat dedesubt.
  • Ascendent: orice nod aflat mai sus pe drumul spre rădăcină.
  • Ascendent direct (părinte/tată): nodul legat imediat deasupra.
  • Frați: noduri cu același părinte.
  • Nod terminal (frunză): nod fără descendenți.

Rădăcina e singurul nod fără părinte.

Metodele de reprezentare cerute de programă

1. Matricea de adiacență

Ca la orice graf. Simplă, dar ocupă n2n^2 memorie.

2. Liste „de descendenți"

Pentru fiecare nod, lista fiilor lui.

3. Vectorul „de tați"

Cel mai economic și cel mai des cerut la BAC. t[i]t[i] = părintele nodului ii, iar pentru rădăcină t[i]=0t[i] = 0.

Exemplu: t = [0, 1, 1, 2, 2] pentru 5 noduri înseamnă:

  • nodul 1 e rădăcina (t[1] = 0);
  • nodurile 2 și 3 au părintele 1;
  • nodurile 4 și 5 au părintele 2;
  • frunzele sunt 3, 4 și 5.

Din vectorul de tați poți afla imediat:

  • rădăcina: singurul ii cu t[i]=0t[i] = 0;
  • frunzele: nodurile care nu apar în vector;
  • drumul spre rădăcină: urci din tată în tată.

Greșeli frecvente

  1. Se spune că un arbore cu nn noduri are nn muchii. Are n−1n - 1.
  2. Se confundă descendentul direct (fiul) cu orice descendent.
  3. În vectorul de tați se caută frunzele printre valori. Frunzele sunt nodurile care nu apar ca valoare.
EXEMPLU, ÎN 4 LIMBAJE

Alege limbajul în care dai examenul. Poți edita codul și îl poți rula direct aici. Programa oficiala de BAC (proba E.d) cere Pascal sau C/C++, la alegere. Python apare in manualele noi si e pus aici pentru inteles, nu ca limbaj de examen.

#include <iostream>
using namespace std;

int main() {
    int n, t[101], esteTata[101] = {0};
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> t[i];
        if (t[i] != 0) esteTata[t[i]] = 1;
    }

    for (int i = 1; i <= n; i++)
        if (t[i] == 0) cout << "radacina=" << i << " ";

    cout << "frunze:";
    for (int i = 1; i <= n; i++)
        if (!esteTata[i]) cout << " " << i;
    return 0;
}
se trimit programului la citire
EXPLOREAZĂ INTERACTIV

Apasă un nod, apoi altul, ca să adaugi sau să scoți muchia dintre ele.

012345
Noduri6
Muchii5
Suma gradelor10
Componente conexe2
Conexnu
Completnu

Suma gradelor e 10, adică dublul celor 5 muchii. Nu e o coincidență: fiecare muchie adaugă câte 1 la gradul ambelor capete.

012345
0010100
1101000
2010100
3101000
4000001
5000010