Trees
Definição
Uma árvore (tree) é um tipo de estrutura de grafo (graph) composta por nós e arestas, tendo as seguintes propriedades:
É acíclica
Existe um caminho da raiz (root) para qualquer nó (node)
Possui N - 1 arestas, onde N é o número de nós na árvore
Cada node possui um parent node, exceto o root node

Conceitos básicos
É importante se familiarizar com alguns conceitos:
Nodes: Abstrações de objetos (aka os círculos)
Edge: Relações entre nodes (aka as linhas)
Root: O primeiro parent node
Internal node: Um node que possui pelo menos um child node
Leaf node: Um node que não possui nenhum child node
Ancestor: Nodes que estão no caminho da root até o node atual
Descendent: Nodes que são alcançados a partir do node atual quando descendo a árvore
Level: O número de ancestors de um node até a root
Height: O número de edges de um node até o caminho mais longo para um leaf node
Depth: O número de edges da root para um node
Binary Tree
Uma árvore n-ária (n-ary tree) é uma árvore em que cada nó tem no máximo n filhos, uma árvore binária é uma árvore n-ária onde n = 2, de modo que cada nó possua 0 a 2 filhos. Vejamos uma implementação de uma binary tree em Python:
class Node:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
Full, Complete & Perfect Binary Tree

Full: Cada node tem 0 ou 2 filhos
Complete: Todos os levels estão completos, exceto possivelmente o último, e todos os nodes no último level ficam o mais à esquerda possível.
Perfect: Cada internal node tem exatamente 2 filhos, e todos os leaf nodes estão no mesmo level.
Uma perfect binary tree possui 3 propriedades interessantes:
A quantidade de nodes é sempre 2^n - 1, onde n é maior level da árvore.
A quantidade de internal nodes é igual à quantidade de leaf nodes - 1.
O número total de nodes é igual a 2 * quantidade de leaf nodes - 1.
Binary Search Tree
Uma binary search tree (BST) é um tipo especial de árvore binária em que cada node segue uma propriedade de ordenação: todos os descendentes da esquerda < node < todos os descendentes da direita.

Balanced Binary Tree
Cada node em uma balanced binary tree segue uma regra de que a diferença da altura da subtree da esquerda e da direita do node atual não é maior que 1.
Ou seja, ela não possui diferenças grotescas na altura da árvore, ela está balanceada.
Searching, insertion & deletion em uma balanced binary tree tem uma time complexity de O (log N), ao invés de O (N) em uma unbalanced binary tree, justamente por causa desse balanceamento.

Tree Traversal
Tree Traversal são formas de você acessar cada node de uma árvore, diferente de estruturas de dados lineares, como arrays, linked lists, stacks, queues, árvores podem ser acessadas de diferentes maneiras.
In-order Traversal
Visita os nodes da esquerda primeiro, e então o node atual, e então finalmente os nodes da direita.

Pre-orderal Traversal
Visita o node atual primeiro, e então os nodes da esquerda, e, finalmente, os nodes da direita.

Post-order Traversal
Visita os nodes da esquerda primeiro, e então os nodes da direita, e, por fim, o node atual.

fonte: "Everything About Trees", AlgoMonster.
keywords: tree, node, edge, root, internal node, leaf node, ancestor, descendent, level, depth, height, full binary tree, complete binary tree, perfect binary tree, binary search tree, balanced binary tree, unbalanced binary tree, tree traversal, in-order traversal, pre-order traversal, post-order traversal
Last updated