Please enable JavaScript.
Coggle requires JavaScript to display documents.
Árvores ! image, image, image, image, image, image, image, download__1_…
Árvores !
Definição
- É uma estrutura hierárquica que consiste em nós conectados por arestas.
- Cada árvore tem um nó especial chamado raiz, que é o ponto de entrada da árvore.
- A partir da raiz, cada nó pode ter zero ou mais nós filhos, criando um relacionamento de pai-filho entre os nós.
- Em computação, as árvores são utilizadas para representar dados que possuem uma relação hierárquica natural.
Terminologia básica
- Raiz: O nó inicial da árvore, que não tem pai.
- Nó: Uma unidade fundamental de uma árvore que contém um valor ou dado e pode ter referências para outros nós (filhos).
- Folha: Um nó que não tem filhos.
- Altura: O número de arestas no caminho mais longo da raiz até uma folha (A distância do nó raiz até a folha mais distante).
- Subárvore: Uma "segunda" árvore formada por um nó e todos os seus descendentes.
- Profundidade: À distância de um nó específico até a raiz da árvore.
- Grau de um nó: O número de filhos que um nó tem.
-
Exemplos de aplicações
- Árvore de decisão: Em aprendizado de máquina, as árvores de decisão são utilizadas para classificar dados, onde cada nó interno representa uma pergunta e as folhas representam as classes.
- Expressões matemáticas: Expressões aritméticas podem ser representadas como árvores, com operadores como nós internos e operandos como folhas.
- Sistemas de arquivos: A estrutura de pastas e arquivos em um computador é uma árvore, onde cada pasta pode conter outras pastas e arquivos.
-
-
Árvore Binária
-
É uma estrutura de dados onde cada nó tem, no máximo, dois filhos, chamados de filho à esquerda e filho à direita. Existem várias operações que podem ser realizadas em árvores binárias, cada uma com suas particularidades.
Inserção
Em uma árvore binária simples, a inserção não segue uma regra específica sobre onde o novo nó deve ser colocado.
-
-
Se o novo valor for menor que o valor do nó atual, move-se para o filho à esquerda.
Se for maior, move-se para o filho à direita.
-
-
Remoção
-
-
-
Nó com dois filhos: O nó é substituído pelo sucessor (ou predecessor), e o sucessor (ou predecessor) é removido.
-
Busca
busca pode ser realizada usando travessias como pré-ordem, em-ordem ou pós-ordem.
-
-
-
Árvore Binária de Busca
-
É um tipo especial de árvore binária onde cada nó segue uma regra específica: o valor de cada nó à esquerda é menor que o valor do nó pai, e o valor de cada nó à direita é maior que o valor do nó pai. Essa propriedade torna a BST muito eficiente para operações de busca, inserção e remoção.
Inserção
-
Passos
-
-
Se o valor a ser inserido for menor que o valor do nó atual, mova-se para o filho à esquerda.
Se o valor a ser inserido for maior, mova-se para o filho à direita.
Repita o processo até encontrar um nó que tenha uma posição vazia ('null') onde o novo nó possa ser inserido como filho à esquerda ou à direita.
Remoção
-
-
Nó com dois filhos:
- Encontre o sucessor in-order (o menor valor na subárvore direita) ou o predecessor in-order (o maior valor na subárvore esquerda).
- Substitua o valor do nó a ser removido pelo valor do sucessor ou predecessor.
- Remova o sucessor ou predecessor, que será uma folha ou terá, no máximo, um filho.
Busca
-
Pode-se decidir, em cada passo, se deve mover-se para a esquerda ou para a direita, de acordo com o valor da chave que está sendo procurada.
Travessia
Pré-Ordem (Pre-Order): Visita a raiz, depois a subárvore esquerda, seguida da subárvore direita. Útil para copiar a árvore.
Em-Ordem (In-Order): Visita a subárvore esquerda, depois a raiz, e por fim a subárvore direita. Em uma BST, isso resulta em uma lista de valores em ordem crescente.
-
-
Pós-Ordem (Post-Order): Visita a subárvore esquerda, depois a subárvore direita, e finalmente a raiz. Útil para deletar ou liberar a árvore.
-
Nível a Nível (Level-Order): Visita os nós nível por nível, da raiz até as folhas.
-
Árvore AVL
-
são projetadas para manter a árvore balanceada, garantindo que a diferença de altura entre as subárvores de qualquer nó seja no máximo
Inserção
Insere-se a chave na posição correta, como em uma BST.
Após a inserção, verifica-se o fator de balanceamento dos nós antecessores, a partir do nó inserido até a raiz.
-
Se o fator de balanceamento de um nó for 2 ou -2 (indicando que o nó está desbalanceado), realiza-se uma rotação (simples ou dupla) para reequilibrar a árvore.
-
Remoção
Encontra-se o nó a ser removido, da mesma forma que em uma BST.
-
Remove-se o nó, garantindo que a árvore continue sendo uma BST.
Após a remoção, verifica-se o fator de balanceamento dos nós afetados, subindo em direção à raiz.
Se um nó estiver desbalanceado, realiza-se uma rotação para restaurar o balanceamento.
Busca
-
Se a chave procurada for menor, segue-se para a subárvore esquerda; se for maior, segue-se para a subárvore direita.
-
Rotações
Em-Ordem (In-Order): Visita os nós em ordem crescente de suas chaves. Usada quando se deseja obter os elementos em ordem ordenada. Ideal para obter todos os valores de uma Árvore AVL em sequência ordenada. Para cada nó, visita-se primeiro a subárvore esquerda, depois o próprio nó, e finalmente a subárvore direita.
-
-
Pré-Ordem (Pre-Order) Visita o nó atual antes de suas subárvores. Útil para copiar a árvore ou para processar cada nó antes de suas subárvores. Para cada nó, visita-se primeiro o próprio nó, depois a subárvore esquerda e, por último, a subárvore direita.
-
-
-
Pós-Ordem (Post-Order) Visita as subárvores antes de visitar o nó atual. Útil para operações que necessitam processar as subárvores antes do próprio nó, como a exclusão de todos os nós de uma árvore. Para cada nó, visita-se primeiro a subárvore esquerda, depois a subárvore direita e, finalmente, o próprio nó.
-
-
Nível (Level-Order) Visita os nós nível por nível, começando pela raiz e movendo-se para baixo. Útil para percorrer a árvore em ordem de profundidade, normalmente implementada usando uma fila. Cada nível da árvore é visitado sequencialmente, da esquerda para a direita.
-
-
Árvore B
-
São estruturas usada para implementar TSs (tabelas de símbolos) muito grandes. Pode ser vista como um índice (análogo ao índice de um livro) para uma coleção de pequenas TSs: o índice diz em qual das pequenas TSs está a chave que você procura.
Inserção
insere uma nova chave na árvore, mantendo a propriedade balanceada da estrutura.
-
Busca do Local de Inserção: Navega-se pela árvore a partir da raiz para encontrar o nó folha onde a nova chave deve ser inserida.
Divisão do Nó (Split): Se o nó folha estiver cheio, ele é dividido em dois nós, e o valor do meio é promovido ao nó pai.
Inserção no Nó Folha: Se o nó folha tem espaço (menos de m - 1 chaves, onde m é a ordem da árvore), a chave é simplesmente adicionada ao nó.
-
Propagação para Cima: Se a divisão do nó causa o pai também ficar cheio, o processo de divisão pode continuar subindo na árvore, até possivelmente dividir a raiz e aumentar a altura da árvore.
-
Remoção
-
Se a chave estiver em um nó folha, remove-a diretamente.
Se a chave estiver em um nó interno:
- Substitui pela chave predecessora ou sucessora.
- Remove a chave da folha correspondente.
Reequilibra a árvore se um nó cair abaixo do número mínimo de chaves:
- Funde o nó com um irmão ou redistribui as chaves entre irmãos.
- Ajusta a raiz, se necessário, reduzindo a altura da árvore.
Travessia
Em-Ordem (In-Order): Visita as chaves em cada nó em ordem crescente. Isso envolve a travessia recursiva de cada subárvore à esquerda, seguida pela visita às chaves no nó, e depois a travessia das subárvores à direita.
-
Pré-Ordem (Pre-Order): Visita cada nó antes de visitar suas subárvores, o que é útil para copiar a árvore ou processar cada nó antes de suas subárvores.
-
Pós-Ordem (Post-Order): Visita as subárvores antes de visitar o nó em si, o que é útil para operações que precisam processar as subárvores antes do nó.
-
-
-
Árvore de Segmentos
-
usada para gerenciar e realizar consultas e atualizações sobre intervalos de um array. Ela é particularmente útil quando se precisa realizar consultas frequentes sobre intervalos ou quando se precisa atualizar valores em um intervalo de maneira eficiente. Cada nó da árvore representa um intervalo específico do array original.
Inserção
- A inserção em uma Árvore de Segmentos não é uma operação típica, pois a árvore é construída a partir de um array inicial. A construção da árvore é feita uma única vez e envolve a criação de nós que representam segmentos do array.
- Ao construir a árvore, cada nó é preenchido com informações sobre o intervalo que ele representa (por exemplo, a soma dos elementos nesse intervalo). A árvore é criada de baixo para cima, combinando os segmentos dos nós filhos para formar nós pais.
-
Remoção
- A remoção direta de elementos em uma Árvore de Segmentos não é uma operação suportada de forma convencional. Em vez disso, a árvore é ajustada para refletir as mudanças feitas no array, usando atualizações.
- Em vez de remover, você pode atualizar o valor em um índice específico e a árvore será ajustada para refletir essa mudança.
-
Busca
- A busca é a operação de consultar um intervalo específico no array para obter informações como soma, mínimo ou máximo. A árvore é percorrida para combinar os intervalos que cobrem o intervalo da consulta.
- A busca divide o intervalo de consulta em segmentos que são representados pelos nós da árvore e combina os resultados desses nós.
-
Travessia
- Pré-Ordem: Visita o nó atual antes de suas subárvores. Pode ser usada para percorrer e processar todos os nós na árvore.
- Em-Ordem: Visita a subárvore esquerda, depois o nó atual, e depois a subárvore direita. Menos comum, mas pode ser usada para percorrer a árvore de uma maneira específica.
*Pós-Ordem: Visita as subárvores antes do nó atual. Útil para liberar a memória da árvore ou para outras operações que requerem processamento das subárvores antes do nó atual.
-
-
-
Trie
-
é uma estrutura de dados de árvore utilizada para armazenar um conjunto dinâmico de strings, onde as chaves são geralmente strings. É especialmente útil para operações que envolvem prefixos, como busca e autocompletar. Em uma Trie, cada nó representa um prefixo comum compartilhado por algumas strings.
Inserção
Inserção de uma string na Trie é feita caractere por caractere, criando novos nós conforme necessário para cada caractere da string.
-
Começa-se pela raiz e para cada caractere da string, segue-se para o nó correspondente ao caractere.
-
Se o nó para o caractere não existir, cria-se um novo nó.
-
Remoção
Remover uma string da Trie envolve a remoção de nós que não são mais necessários após a remoção da string.
-
Primeiro, busca-se a string para garantir que ela está na Trie.
-
Remove-se a string caractere por caractere, começando do final da string.
Se um nó não é mais necessário (não faz parte de outras strings), ele é removido.
Busca
A busca em uma Trie é feita caractere por caractere, seguindo os nós correspondentes a cada caractere da string de busca.
-
Começa-se pela raiz e para cada caractere da string, segue-se para o nó correspondente.
Se um caractere não corresponder a um nó existente, a string não está na Trie.
-
Verifica-se se o último nó da busca é um nó de término de string (indicando que a string completa está presente).
Travessia
Pré-Ordem: Visita o nó atual antes de suas subárvores. Pode ser usada para listar todas as strings armazenadas na Trie, ou para processar as strings de forma específica.
-
-
Em-Ordem: Não é comumente aplicada em Tries, pois a estrutura não é binária e não possui uma ordem natural de filhos.
-
Pós-Ordem: Visita as subárvores antes de visitar o nó atual. Pode ser utilizada para liberar memória ou para processar strings de forma específica, processando as strings antes de retornar à raiz.
-
-
Elas são usadas em sistemas de arquivos, banco de dados, inteligência artificial, redes de computadores, jogos (ex: tabuleiro) e muito mais
Usada em várias aplicações que requerem organização e acesso eficiente a dados. Desde bancos de dados e sistemas de arquivos até aplicações em IA e e-commerce
são fundamentais em qualquer aplicação, especialmente quando os dados são armazenados em discos ou sistemas de armazenamento externo. Também em sistemas de gerenciamento de banco de dados, sistemas de arquivos, motores de busca e muitas outras aplicações críticas que lidam com armazenamento e recuperação de grandes quantidades de dados.
É especialmente relevante em sistemas onde a manutenção de um tempo de resposta rápido e previsível é crítico, como em bancos de dados, sistemas de arquivos, roteamento de redes, compiladores, sistemas em tempo real e jogos.
Ideal para problemas que envolvem consultas e atualizações frequentes em intervalos. Usada em competições para resolver problemas de intervalos de forma eficiente. Utilizada em algoritmos que precisam de consultas rápidas sobre intervalos de dados, como no processamento de imagens e na renderização de gráficos. Aplicada em sistemas que requerem operações rápidas de agregação e atualização de dados, como em análises financeiras e estatísticas.
É utilizada principalmente em: Busca e Autocompletar: Para encontrar e sugerir palavras rapidamente com base em prefixos. Corretores Ortográficos: Para armazenar dicionários e sugerir correções ou alternativas. Processamento de Linguagem Natural (NLP): Para análise de texto e recuperação de informações. Sistemas de Arquivos: Para gerenciar diretórios e localizar arquivos por caminhos. Compiladores e Intérpretes: Para armazenar e buscar identificadores e palavras-chave de forma eficiente.
-