← Hub Principal |
🌲

04: Self-Balancing AVL Tree & Rotations

Rust 2021 (Tree Algorithms)
Árvores Auto-Balanceadas & Invariantes Módulo 04

Árvore AVL (Adelson-Velsky & Landis)

Uma implementação rigorosa da primeira árvore de busca binária auto-balanceada inventada na ciência da computação (1962). A AVL assegura que a diferença de altura entre as subárvores esquerda e direita de qualquer nó nunca exceda 1, eliminando o risco de degeneração em listas lineares.


01. A Armadilha das BSTs Ingênuas: Degeneração para O(N)

Em uma árvore binária de busca comum, se você inserir elementos em ordem crescente (ex: [10, 20, 30, 40, 50]), cada novo nó se tornará o filho direito do anterior. A árvore se degenera em uma lista ligada de profundidade $N$, destruindo o benefício da busca binária e degradando o tempo de consulta de $O(\log N)$ para $O(N)$.

A Invariante AVL:

Para todo nó $v$: $\text{BalanceFactor}(v) = \text{height}(v.\text{left}) - \text{height}(v.\text{right}) \in \{-1, 0, 1\}$.

Se qualquer inserção provocar $|\text{BF}| > 1$, rotações de ponteiros são acionadas na subida da pilha de recursão para restaurar a invariante em $O(1)$ tempo local.

02. As 4 Rotações Fundamentais

A reestruturação da árvore é dividida em dois casos simples e dois casos duplos:

1. Rotação Direita (LL)

Ocorre quando a subárvore esquerda do nó filho esquerdo está mais pesada. A raiz desce para a direita e o filho esquerdo se torna a nova raiz local.

2. Rotação Esquerda (RR)

Espelho da rotação direita. Ocorre quando a subárvore direita do filho direito está pesada. A raiz desce para a esquerda.

3. Rotação Dupla Esquerda-Direita (LR)

Ocorre em zigue-zague à esquerda. Aplica rotação esquerda no filho esquerdo, convertendo no caso LL, seguida por rotação direita na raiz local.

4. Rotação Dupla Direita-Esquerda (RL)

Zigue-zague à direita. Aplica rotação direita no filho direito (convertendo para RR), seguida por rotação esquerda na raiz local.

03. Engenharia em Rust: Rotações Sem Unsafe

Em C++, rotações manipulam ponteiros brutos soltos. Em Rust, como cada nó possui posse exclusiva (Box<Node<T>>) de seus filhos, não é possível fazer node.left.right = node diretamente sem violar o Borrow Checker.

O Idioma Option::take():

Utilizamos node.left.take(), que move o valor de dentro do Option para uma variável local enquanto deixa temporariamente um None no lugar. Isso transfere a propriedade do nó sem violar o modelo de posse única e sem nenhuma linha de código unsafe.

cargo run --bin avl_tree
Ambiente pronto. Clique em "Compilar & Executar" para construir a Árvore AVL e desenhar os nós em ASCII.