AVL fa (AVL tree)

  • $o$ $0$
  • $+$ $1$
  • $++$ $2$
  • $-$ $-1$
  • $--$ $-2$
$AVLinsert(\&t : Node^*; k : \mathcal{T}; \& d: \mathbb{B})$


$t = \emptyset$

$t := \text{new} \space Node(k)$
$k < t \rightarrow key$

$k > t \rightarrow key$

$\text{ELSE}$
$d := true$ $AVLinsert(t \rightarrow left, k, d)$ $AVLinsert(t \rightarrow right, k, d)$ $d := false$

$d$


$d$

$leftSubTreeGrown(t, d)$ $\text{SKIP}$ $rightSubTreeGrown(t, d)$ $\text{SKIP}$

$leftSubTreeGrown(\&t : Node^*; \& d: \mathbb{B})$


$t \rightarrow b = -1$

$l := t \rightarrow left$ $t \rightarrow b := t \rightarrow b -1$

$l \rightarrow b = -1$

$d := (t \rightarrow b < 0)$
$balanceMMm(t, l)$ $balanceMMp(t, l)$
$d := false$

$rightSubTreeGrown(\&t : Node^*; \& d: \mathbb{B})$


$t \rightarrow b = 1$

$r := t \rightarrow right$ $t \rightarrow b := t \rightarrow b +1$

$r \rightarrow b = 1$

$d := (t \rightarrow b > 0)$
$balancePPp(t, l)$ $balancePPm(t, l)$
$d := false$

$balancePPp(\&t, r : Node^*)$

$t \rightarrow right := r \rightarrow left$
$r \rightarrow left := t$
$t \rightarrow b := 0$
$r \rightarrow b := t \rightarrow b$
$t := r$

$balanceMMm(\&t, l : Node^*)$

$t \rightarrow left := l \rightarrow right$
$l \rightarrow right := t$
$t \rightarrow b := 0$
$l \rightarrow b := t \rightarrow b$
$t := l$

$balancePPm(\&t, r : Node^*)$

$l := r \rightarrow left$
$t \rightarrow right := l \rightarrow left$
$r \rightarrow left := l \rightarrow right$
$l \rightarrow left := t$
$l \rightarrow right := r$
$t \rightarrow b := - \lfloor (l \rightarrow b + 1) / 2 \rfloor$
$r \rightarrow b := \lfloor (1-l \rightarrow b) / 2 \rfloor$
$l \rightarrow b := 0$
$t := l$

$balanceMMp(\&t, l : Node^*)$

$r := l \rightarrow right$
$l \rightarrow right := r \rightarrow left$
$t \rightarrow left := r \rightarrow right$
$r \rightarrow left := l$
$r \rightarrow right := t$
$l \rightarrow b := - \lfloor (r \rightarrow b + 1) / 2 \rfloor$
$t \rightarrow b := \lfloor (1-r \rightarrow b) / 2 \rfloor$
$r \rightarrow b := 0$
$t := r$

$AVLremMin(\&t, \&minp : Node^*; \&d : \mathbb{B})$


$t \rightarrow left = \emptyset$

$minp := t$ $AVLremMin(t \rightarrow left, minp, d)$
$t := minp \rightarrow right$
$minp \rightarrow right := \emptyset$
$d$

$d := true$ $leftSubTreeShrunk(t, d)$ $\text{SKIP}$

$leftSubTreeShrunk(\&t : Node^*; \&d : \mathbb{B})$


$t \rightarrow b = 1$

$balancePP(t, d)$ $t \rightarrow b := t \rightarrow b + 1$
$d := (t \rightarrow b = 0)$

$balancePP(\&t : Node^*; \&d : \mathbb{B})$

$r := t \rightarrow right$

$r \rightarrow b = -1$

$r \rightarrow b = 0$

$r \rightarrow b = 1$
$balancePPm(t, r)$ $balancePP0(t, r)$ $balancePPp(t, r)$
$d := false$

$balancePP0(\&t, r : Node^*)$

$t \rightarrow right := r \rightarrow left$
$r \rightarrow left := t$
$t \rightarrow b := 1$
$r \rightarrow b := -1$
$t := r$
  • A törlendő csúcsnak nincs bal gyereke, ekkor a helyét a jobb gyerek veszi át.
  • A törlendő csúcsnak nincs jobb gyereke, ekkor a helyét a bal gyerek veszi át.
  • A törlendő csúcsnak kettő gyereke van, ekkor a jobb részfa minimuma kerül a helyére, használva a $remMin()$ eljárást. (Természetesen a bal oldali részfa maximuma is megfelelő lenne a törlendő elem helyére.)
$AVLdel(\&t : Node^*, k : \mathcal{T}, \&d : \mathbb{B})$


$t \neq \emptyset$


$k < t \rightarrow key$

$k > t \rightarrow key$

$k = t \rightarrow key$
$d := false$
$AVLdel(t \rightarrow left, k, d)$ $AVLdel(t \rightarrow right, k, d)$ $AVLdelRoot(t, d)$

$d$


$d$

$leftSubTreeShrunk(t, d)$ $\text{SKIP}$ $rightSubTreeShrunk(t, d)$ $\text{SKIP}$

$AVLdelRoot(\&t : Node^*; \&d : \mathbb{B})$


$t \rightarrow left = \emptyset$

$t \rightarrow right = \emptyset$

$t \rightarrow left \neq \emptyset \land t \rightarrow right \neq \emptyset$
$p := t$ $p := t$ $rightSubTreeMinToRoot(t, d)$
$t := p \rightarrow right$ $t := p \rightarrow left$
$\text{delete} \space p$ $\text{delete} \space p$
$d$

$d := true$ $d := true$ $rightSubTreeShrunk(t, d)$ $\text{SKIP}$

$rightSubTreeMinToRoot(\&t : Node^*; \&d : \mathbb{B})$

$AVLremMin(t \rightarrow right, p, d)$
$p \rightarrow left := t \rightarrow left$
$p \rightarrow right := t \rightarrow right$
$p \rightarrow b := t \rightarrow b$
$\text{delete} \space t$
$t := p$
  • Beszúrás helyének megkeresése: $log \space n$
  • AVL tulajdonság ellenőrzése: $log \space n$
  • Jelzők beállítása: konstans időben megtörténik
  • $MT_{insert}(n) \in \Theta(log \space n)$
  • $MT_{remMin}(n) \in \Theta(log \space n)$
  • $MT_{del}(n) \in \Theta(log \space n)$

Feladatok

Az alábbi feladatok a gyakorlatokon elvégzendő kötelező, illetve gyakorló feladatok.