Leksion 10 Algoritmike

Pemet e Kerkimit Binar

Implementimi i PKB-ve

Definicione

  • Pemë binare: Një strukturë me maksimum dy bij për çdo nyje.

  • Pemë e kërkimit binar (PKB): Një pemë binare ku:

    • Çdo nënpemë e majtë ka çelësa më të vegjël se çelësi i nyjes.

    • Çdo nënpemë e djathtë ka çelësa më të mëdhenj se çelësi i nyjes.

  • Nënpemë: Pema bijë e një nyjeje.

  • Çelës: Një pjesë e të dhënave që e rendit, indekson, ose referohet grupi i të dhënave.

Krijimi i PKB-ve në C++

struct peme_nyje {
    int info;
    peme_nyje *majte;
    peme_nyje *djathte;
};
peme_nyje *rrenja; // var global
bool ugjet;
int celes;

Funksioni Bosh

  • bool bosh(peme_nyje *p): Kthen true nëse pema është boshe, false përndryshe.

  • Implementim:

if (p == NULL) {
    return true;
} else {
    return false;
}

Shtimi i Kulmeve në PKB

void insert(int vl, peme_nyje *&p) {
    if (p == NULL) {
        p = new peme_nyje;
        p->info = vl;
        p->majte = NULL;
        p->djathte = NULL;
    } else {
        if (vl <= p->info)
            insert(vl, p->majte);
        else
            insert(vl, p->djathte);
    }
}

Bredhja Pararendore (Pre-order Traversal)

void pararendore(peme_nyje *t) {
    if (t != NULL) {
        cout << t->info;
        pararendore(t->majte);
        pararendore(t->djathte);
    }
}

Bredhja Nderrendore (In-order Traversal)

void nderrendore(peme_nyje *t) {
    if (t != NULL) {
        nderrendore(t->majte);
        cout << t->info;
        nderrendore(t->djathte);
    }
}

Bredhja Pasrendore (Post-order Traversal)

void pasrendore(peme_nyje *t) {
    if (t != NULL) {
        pasrendore(t->majte);
        pasrendore(t->djathte);
        cout << t->info;
    }
}

Kërkimi në PKB

void kerko(int celes, bool &ugjet, peme_nyje *t) {
    if ((t != NULL) && (!ugjet)) {
        if (celes == t->info)
            ugjet = true;
        else if (celes < t->info)
            kerko(celes, ugjet, t->majte);
        else
            kerko(celes, ugjet, t->djathte);
    }
}

Heqja e Nyjeve në PKB

  • Raste të ndryshme të heqjes së nyjeve:

    • Një bir ose asnjë bir: Thjesht kthehet biri tjetër.

    • Dy bija: Përdorimi i pasardhësit më të vogël nga nënpema e djathtë.

Funksioni Përdorimi për Heqjen e Nyjes

struct peme_nyje* fshijNyje(struct peme_nyje *t, int celes) {
    if (t == NULL) return t;
    if (celes < t->celes)
        t->majte = fshijNyje(t->majte, celes);
    else if (celes > t->celes)
        t->djathte = fshijNyje(t->djathte, celes);
    else {
        // Heqja e nyjes
    }
    return t;
}

Rrotullimet në PKB

  • Rrotullimet majtas dhe djathtas përdoren për të ruajtur balancën e pemës në PKB.

Rrotullimi Majtas

Left-Rotate(T, x) {
    // Algoritmi për rrotullimin majtas
}

Rrotullimi Djathtas

Right-Rotate(T, x) {
    // Algoritmi për rrotullimin djathtas
}

Shtimi në PKB

Shtimi nga Rrenja

  • Rregulli: Në zbritje majtas ose djathtas, kryhen rrotullime për të rikthyer përmbajtjen e pemës.

Shtimi si Një Nyje Pranë Rrenjës

  • Ky metodë përpiqet të zvogëlojë lëvizjen e nyjeve përmes rrotullimeve pas shtimit.

Konkluzion

  • Pema e kërkimit binar ofron efikasitet në kërkime dhe organizimin e të dhënave në mënyrë hierarkike, duke ndihmuar në ruajtjen e performancës gjatë operacioneve të ndryshme si shtimi, heqja dhe kërkimi.