Você está na página 1de 34

28/02/2023, 19:12 Estrutura de Dados

ESTRUTURA DE DADOS
UNIDADE 4 – Á RVORES DE DECISÃ O

Katia Cristina Lage dos Santos

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 1/34
28/02/2023, 19:12 Estrutura de Dados

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 2/34
28/02/2023, 19:12 Estrutura de Dados

Introdução
Certamente você já teve que preencher algum questionário ou formulário que, ao final das respostas, é
fornecido um resultado de acordo com as opçõ es marcadas, não é? Outra situação similar é quando você
chega para um atendimento e a enfermeira que faz a triagem realiza uma série de perguntas para identificar
qual é a sua prioridade no atendimento. Esse tipo de mecanismo que realiza uma decisão com base nas
respostas é chamado de mecanismos de decisão. Um tipo abstrato de dados comumente utilizado para
representar esse mecanismo é denominado árvore de decisão. Será que essa estrutura de dados tem alguma
analogia com o conceito de árvore na vida real?
Assim como os demais tipos abstratos de dados, as árvores de decisão têm, sim, uma analogia ao conceito de
árvore real. Elas são formadas por folhas e galhos que ligam os nó s. Assim, se esse é outro tipo abstrato de
dado, então temos uma nova forma de armazenar os dados e as operaçõ es relacionados ao conceito? Existe
apenas um tipo ou diferentes tipos de árvores de decisão?
Ao longo desta unidade, veremos sobre a forma de armazenamento, as operaçõ es e dois tipos de árvores de
decisão: as árvores binárias e AVL. Entenderemos que os dois modelos têm uma característica em comum: a
partir de um mesmo nó pai, ambas têm, no máximo, dois nó s filhos que estão diretamente ligados a ele. Serão
apresentados exemplos de como armazenar uma informação em um nó de uma árvore e como relacionar um
nó com seus filhos. Em termos de operaçõ es sobre esses dados, serão vistas as operaçõ es de leitura, inserção,
remoção e busca por um nó em uma árvore, com a implementação de cada um dos métodos. No caso da
busca, veremos três métodos de caminhamento distintos.
Vamos, então, iniciar nossos estudos!

4.1 Árvores binárias


Em termos de representação, a melhor forma de comparar uma árvore de decisão ao conceito que
conhecemos na vida real é pensar em uma árvore invertida. Geralmente, a raiz da planta fica em sua base, na
parte mais baixa, sendo que, a partir dela, crescem os galhos, que, por sua vez, têm várias folhas.
A figura a seguir retrata um tipo abstrato de dados no modelo árvore.

Figura 1 - Representação gráfica de uma árvore de decisão


Fonte: Elaborada pela autora, 2019.

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 3/34
28/02/2023, 19:12 Estrutura de Dados

#PraCegoVer: A imagem mostra uma representação visual de uma árvore de decisão. Os nó s da árvores são
representados por círculos e conteú do dos nó s está representado por letras. As ligaçõ es dos nó s está
representadas por seta que saem de um nó para o outro. Nesta árvore, o nó raíz possui o valor A. O seu lado
esquerdo está conectado com o nó B e o seu lado direito está conectado com o nó C. Já o nó B possui três
conexõ es. Uma conexão levando ao Nó D, outra conexão levando ao nó E e outra conexão levando ao nó F. Por
fim, o nó C possui duas conexõ es. Uma conexão levando ao nó G e outra conexão levando ao nó H.

Na árvore da figura anterior, cada círculo com uma letra é denominado “nó ” ou “célula”. O nó A é chamado de
“nó raiz”, pois dele derivam os demais nó s. Dizemos que o nó raiz está no nível 0 da árvore.
Cada um dos nó s ligados diretamente ao nó A é chamado de “nó filho de A”, ou seja, B e C. Eles, por sua vez,
estão no nível 1 da árvore, ligados por meio de arestas ou galhos.
Os nó s D, E, F, G e H são chamados de nó s filhos de B e C, sendo estes chamados de “nó s folhas”, pois deles
não derivam outros nó s na árvore. Observe que não tem uma aresta que sai desses nó s, apenas aresta que
chega de B ou C. No caso da nossa representação, os nó s folhas estão no nível 2. Por fim, dizemos que a árvore
tem altura 2, pois existem dois níveis que separam o nó raiz dos nó s folhas.

VOCÊ O CONHECE?
Alan Mathison Turing foi um matemá tico, lógico, criptoanalista e cientista da
computaçã o, influente no desenvolvimento da Ciê ncia da Computaçã o e na
formalizaçã o do conceito de algoritmo e computaçã o com a má quina de Turing. Em
especial, també m foi o responsável pela criaçã o do Teste de Turing, mecanismo que
verifica a capacidade de um software se comportar de forma similar aos seres
humanos (OLIVEIRA, 2019).

Uma árvore binária tem como característica fundamental todos os nó s que não sejam nó s folhas com um ou
dois nó s filhos (PUGA; RISSETTI, 2010). Daí vem o nome da árvore.
Vejamos a figura a seguir, que representa uma árvore binária bem similar à árvore anterior. A diferença é que,
nesta, os nó s B e C têm exatamente dois filhos cada um.

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 4/34
28/02/2023, 19:12 Estrutura de Dados

Figura 2 - Representação gráfica de uma árvore binária


Fonte: Elaborada pela autora, 2019.

#PraCegoVer: A imagem mostra uma representação visual de uma árvore binária. Os nó s da árvores são
representados por círculos e conteú do dos nó s está representado por letras. A ligaçõ es dos nó s está
representadas por seta que saem de um nó para o outro. Nesta árvore, o nó raíz possui o valor A. O seu lado
esquerdo está conectado com o nó B e o seu lado direito está conectado com o nó C. considerando o nó B,
temos que, ao seu lado esquerdo tem uma conexão com o nó D e ao seu lado direito tem uma conexão com o
nó E. Considerando o nó C, temos que, ao seu lado esquerdo temos uma conexão com o nó F e ao seu lado
direito temos uma conexão com o nó G.

No item a seguir, veremos a forma de armazenamento e as operaçõ es que podem ser realizadas na árvore de
decisão. Acompanhe!

4.1.1 Armazenamento de dados em uma árvore binária


Um nó , em uma árvore, armazena informaçõ es e referências para os filhos da esquerda e da direita. Esses
elementos devem ser declarados como atributos de uma classe. A figura a seguir apresenta a definição de um
nó genérico.

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 5/34
28/02/2023, 19:12 Estrutura de Dados

Figura 3 - Representação de um nó na árvore binária


Fonte: Elaborada pela autora, 2019.

#PraCegoVer: A imagem mostra um trecho de có digo de 5 linhas de programa. Enumerando cada linha temos:

Linha 1: class NoArvoreBinario{


Linha 2: private String informacao;
Linha 3: private NoArvoreBinario filhoEsquerda;
Linha 4: private NoArvoreBinario filhoDireita;
Linha 5: }

Na definição da classe “NoArvoreBinario”, a informação será armazenada no primeiro atributo do tipo string.
Se este for um nó folha, os valores de “filhoEsquerda” e “filhoDireita” será null. Caso contrário, cada um dos
nó s referenciará outro “NoArvore” correspondente ao filho da esquerda ou da direita.  Clique nas setas e
aprenda mais sobre o tema.

No entanto, o que acontece se a informação que precisa ser armazenada na árvore possui um tipo
mais complexo que não pode ser guardado como um string? Neste caso, quando a informação que
precisa ser armazenada no tipo abstrato de dados (TAD) tem várias características, criamos uma
classe e, nela, encapsulamos os atributos. 

Vamos considerar o seguinte cenário: criaremos uma representação da árvore genealó gica em que
cada pessoa tem, no máximo, dois filhos. Isto é, considerando os pais, avó s, filhos e netos, todos
os nó s respeitam a propriedade para que possamos construir uma árvore binária. Assim, cada
indivíduo tem um conjunto de informaçõ es que o define, por isso, usaremos um tipo complexo
para definir ou encapsular esse dado. 

Inicialmente, observe na figura a seguir o trecho de có digo que contém a definição de uma classe “Pessoa”.
Segundo tal definição, cada pessoa tem três informaçõ es: nome, CPF e data de nascimento.

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 6/34
28/02/2023, 19:12 Estrutura de Dados

Figura 4 - Classe “Pessoa”


Fonte: Elaborada pela autora, 2019.

#PraCegoVer: A imagem mostra um trecho de có digo de 23 linhas de programa. Enumerando cada linha
temos:

Linha 1: class Pessoa {


Linha 2: private String nome;
Linha 3: private String cpf;
Linha 4: private Date dataNascimento;
Linha 5: public String getNome(){
Linha 6: return nome;
Linha 7: }

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 7/34
28/02/2023, 19:12 Estrutura de Dados

Linha 8: public void setNome(String nome) {


Linha 9: this.nome = nome;
Linha 10: }
Linha 11: public String getCpf(){
Linha 12: return cpf;
Linha 13: }
Linha 14: public void setCpf(String cpf){
Linha 15: this.cpf = cpf;
Linha 16: }
Linha 17: public Date getDataNascimento(){
Linha 18: return dataNascimento;
Linha 19: }
Linha 20: public void setDataNascimento(Date data){
Linha 21: dataNascimento = data;
Linha 22: }
Linha 23: }

Veja que, como os atributos são privados, foram criados métodos pú blicos para fazer a leitura de cada um
deles, chamados de métodos get. Para alterar o valor dos atributos, foram criados métodos set.
Agora, vejamos a figura na sequência.

Figura 5 - Nó de uma árvore cujos nó s são “Pessoas”


Fonte: Elaborada pela autora, 2019.

#PraCegoVer: A imagem mostra um trecho de có digo de 5 linhas de programa. Enumerando cada linha temos:

Linha 1: class NoArvoreBinario{


Linha 2: private Pessoa pessoa;
Linha 3: private NoArvoreBinario filhoEsquerda;
Linha 4: private NoArvoreBinario filhoDireita;
Linha 5: }

A classe “NoArvore”, relacionada ao novo contexto, deve ter a informação como sendo um objeto do tipo
“Pessoa”, conforme vimos na figura anterior.

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 8/34
28/02/2023, 19:12 Estrutura de Dados

VAMOS PRATICAR?
Agora, faremos a representaçã o de uma á rvore biná ria cujos elementos
tipo “Fruta”. Para isso, crie duas classes Java: “Fruta” e “NoFruta”.
A classe “Fruta” terá trê s atributos: nome, cor e tipo. Declare como a
privados e crie os mé todos get e set para cada atributo.

A classe “NoFruta” será similar à classe “NoArvore”, declarada anterio


sendo que a diferença estará no tipo de informaçã o, que, no caso, será
“Fruta”. O nome da variável de referê ncia deste será “fruta” e os fi
esquerda e da direta deverã o ter, respectivamente, os nomes “frutaEsqu
“frutaDireita”.

Agora que já vimos a forma de armazenamento das informaçõ es em uma árvore, veremos as operaçõ es sobre
esse tipo de dado.

4.1.2 Operações de leitura e inserção de nós em árvores binárias


Como a árvore é um tipo abstrato de dados e já definimos a forma de armazenamento destes, precisamos,
agora, definir as operaçõ es sobre os dados armazenados.
Em linhas gerais, temos que criar as operaçõ es descritas abaixo. Clique e confira!

Ler a informação de nó de uma árvore.

Inserir ou alterar um nó em uma árvore.

Verificar se a árvore está vazia.

Remover um nó de uma árvore.

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3d… 9/34
28/02/2023, 19:12 Estrutura de Dados

Buscar um elemento na árvore.

Inicialmente, vamos tratar da leitura e inserção/alteração de um elemento na árvore binária. Tanto a leitura
quanto a inserção pode ser referente ao filho da esquerda ou da direita. Para
Depois que encapsulamos as informaçõ es da pessoa em uma classe, precisamos criar a representação de um
nó dessa árvore genealó gica. Na figura a seguir, temos o trecho de có digo em que a informação é do tipo
“Pessoa”. 

Figura 6 - Nó de uma árvore com informaçõ es sobre uma pessoa


Fonte: Elaborada pela autora, 2019.

#PraCegoVer: A imagem mostra um trecho de có digo de 25 linhas de programa. Enumerando cada linha
temos:

Linha 1: class NoArvore{

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 10/34
28/02/2023, 19:12 Estrutura de Dados

Linha 2: private Pessoa pessoa;


Linha 3: private NoArvore filhoEsquerda;
Linha 4: private NoArvore filhoDireita;
Linha 5: public Pessoa getPessoa(){
Linha 6: return pessoa;
Linha 7: }
Linha 8: public void setPessoa(Pessoa pessoa){
Linha 9: this.pessoa = pessoa;
Linha 10: }
Linha 11: public NoArvore getFilhoEsquerda(){
Linha 12: return filhoEsquerda;
Linha 13: }
Linha 14: public void setFilhoEsquerda(NoArvore filhoEsquerda)
Linha 15: {
Linha 16: this.filhoEsquerda = filhoEsquerda;
Linha 17:}
Linha 18: public NoArvore getFilhoDireita(){
Linha 19: return filhoDireita;
Linha 20: }
Linha 21: public void setFilhoDireita(NoArvore filhoDireita)
Linha 22: {
Linha 23: this.filhoDireita = filhoDireita;
Linha 24: }
Linha 25: }

Observe que, nesse caso, a informação é o objeto do tipo “Pessoa”. Como este atributo e as referências para os
filhos da esquerda e da direita são privados, foram criados métodos pú blicos get e set para, respectivamente,
fazer a leitura e inserção/alteração do valor desses atributos. Para começar, as referências para os filhos da
esquerda e direita são nulas, pois não estão referenciando um objeto do tipo “NoArvore”.
Assim, na sequência, precisamos criar a árvore em si. Vamos considerar uma parte da árvore ou subárvore em
que José é o pai e Francisco e Maria são os filhos.

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 11/34
28/02/2023, 19:12 Estrutura de Dados

Figura 7 - Representação de uma subárvore de José e seus filhos


Fonte: Elaborada pela autora, 2019.

#PraCegoVer: A imagem mostra uma representação de uma subárvore. Os nó s da árvores são representados
por círculos e conteú do dos nó s está representado por nomes. A ligaçõ es dos nó s está representada por setas
que saem de um nó para o outro. Nesta árvore, o nó raíz possui o valor José. O seu lado esquerdo está
conectado com o nó Francisco e o seu lado direito está conectado com o nó Maria.

O trecho de có digo correspondente à criação do primeiro nó da árvore, também conhecido como nó raiz. Este
é do tipo “NoArvore”, já que também contém informaçõ es da árvore genealó gica. Para preencher a informação
sobre a primeira pessoa mapeada na família, foi criado um objeto do tipo pessoa, sendo “primeiraPessoa” o
nome da variável que referencia o primeiro objeto. Além disso, o método set foi invocado para preencher os
atributos da primeira pessoa: nome, CPF e data de nascimento. Posteriormente, foram associados os dados da
primeira pessoa como sendo o elemento raiz da árvore, por meio do método “setPessoa” da classe
“NoArvore”. Veja a figura na sequência.

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 12/34
28/02/2023, 19:12 Estrutura de Dados

Figura 8 - Declaração de uma árvore com preenchimento do nó raiz


Fonte: Elaborada pela autora, 2019.

#PraCegoVer: A imagem mostra um trecho de có digo de 14 linhas de programa. Enumerando cada linha
temos:

Linha 1: class Arvore{


Linha 2:
Linha 3: public static void main()
Linha 4: {
Linha 5: NoArvore raiz = new NoArvore();
Linha 6: Pessoa primeiraPessoa = new Pessoa();
Linha 7: primeiraPessoa.setNome("José Araú jo");
Linha 8: primeiraPessoa.setCpf("001112223-44");
Linha 9: primeiraPessoa.setDataNascimento(new Date(1811, 10, 10));
Linha 10:
Linha 11: raiz.setPessoa(primeiraPessoa);
Linha 12: }
Linha 13:
Linha 14:}

Precisamos, então, criar os nó s correspondentes aos filhos de José e atribuir os valores aos nó s da esquerda e
da direita. O trecho de có digo da figura na sequência nos mostra essa implementação de modo ilustrativo.

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 13/34
28/02/2023, 19:12 Estrutura de Dados

Figura 9 - Implementação da subárvore de José e seus filhos


Fonte: Elaborada pela autora, 2019.

#PraCegoVer: A imagem mostra um trecho de có digo de 26 linhas de programa. Enumerando cada linha
temos:

Linha 1: Class ArvoreGenealogica{


Linha 2:
Linha 3: private NoArvore raiz;
Linha 4:
Linha 5: public static void main()
Linha 6: {
Linha 7: raiz = new NoArvore();
Linha 8: Pessoa primeiraPessoa = new Pessoa();
Linha 9: primeiraPessoa.setNome("José Araú jo");
Linha 10: primeiraPessoa.setCpf("001112223-44");
Linha 11: primeiraPessoa.setDataNascimento(new Date(1811, 10, 10));
Linha 12:
Linha 13: raiz.setPessoa(primeiraPessoa);

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 14/34
28/02/2023, 19:12 Estrutura de Dados

Linha 14:
Linha 15: Pessoa francisco = new Pessoa();
Linha 16: francisco.setNome("Francisco Araú jo");
Linha 17: francisco.setCpf("998886665-31");
Linha 18: francisco.setDataNascimento(new Date(1830, 06, 01));
Linha 19: raiz.setFilhoEsquerda(francisco);
Linha 20:
Linha 21: Pessoa maria = new Pessoa();
Linha 22: francisco.setNome("Maria Araú jo");
Linha 23: francisco.setCpf("223334445-76");
Linha 24: francisco.setDataNascimento(new Date(1836, 02, 25);
Linah 25: raiz.setfilhoDireita(maria);

Para criar os nó s da árvore correspondente aos filhos “Francisco” e “Maria”,  inicialmente, foi criado um objeto
do tipo “NoArvore” para cada um deles. A inserção do nó filho da esquerda foi enviada à variável de referência
para o objeto criado anteriormente como parâmetro do método “setFilhoEsquerda()” a partir do nó raiz. De
forma similar, para inserir o nó filho da direita, foi necessário passar a referência do nó correspondente à filha
“Maria” para o método “setFilhoDireita()” a partir do nó raiz.
Para verificar se uma árvore está vazia, é necessário analisar se a raiz da árvore não tem nenhuma referência
para o elemento correspondente à informação da árvore. O método retorna true (verdadeiro) se a árvore está
vazia e false (falso) se for o contrário. No exemplo da árvore genealó gica, temos que verificar se o atributo raiz
está apontando para o valor null.
O trecho de có digo da figura a seguir apresenta a implementação do método “estaVazia()”. Assim, se a
informação for um tipo de dado primitivo, temos que verificar em qual valor padrão que a variável inicia ou
iniciar o nó raiz com um valor pré-definido que indique que nenhum nó efetivo foi adicionado à árvore.

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 15/34
28/02/2023, 19:12 Estrutura de Dados

Figura 10 - Método que verifica se a árvore está vazia


Fonte: Elaborada pela autora, 2019.

#PraCegoVer: A imagem mostra um trecho de có digo de 15 linhas de programa. Enumerando cada linha
temos:

Linha 1: class ArvoreGenealogica{


Linha 2:
Linha 3: private NoArvore raiz;
Linha 4:
Linha 5: public boolean estaVazia(){
Linha 6: if(raiz == null){
Linha 7: return true;
Linha 8: }
Linha 9: return false;
Linha 10: }

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 16/34
28/02/2023, 19:12 Estrutura de Dados

Linha 11:
Linha 12: public static void main()
Linha 13 {...}
LInha 14:
Linha 15: }

Para realizar a busca em uma árvore, podemos implementar um mecanismo similar à busca sequencial, em
que todos os nó s da árvore são visitados até que a informação seja encontrada. Como alternativa para
melhorar a performance da busca, podemos definir um critério para a inserção dos filhos da esquerda e da
direita em um nó , com base em uma informação-chave, a fim de se criar o que chamamos de “busca binária de
busca”. 

VAMOS PRATICAR?
Vamos continuar a implementar a representaçã o de uma á rvore biná r
elementos sã o do tipo “Fruta”? Para isso, utilize as duas classes
anteriormente: “Fruta” e “NoFruta”.
Crie os mé todos get e set de cada um dos atributos: “fruta”, “frutaEsqu
“frutaDireita”. Crie, també m, um mé todo para verificar se a á rvore est
retornando true em caso verdadeiro ou false do contrá rio.
Agora, crie uma classe “Arvore” e declare o mé todo main. Declare um nó d
“NoFruta” e faça uma chamada no mé todo que verifica se a á rvore está v
seguida, crie um objeto do tipo “Fruta” e passe a referê ncia dele para o
“setFruta” da classe “NoFruta”. Confira se os valores de “filhoEsqu
“filhoDireita” sã o iguais a null.

Por fim, crie frutas filhas da esquerda e da direita e teste os mé todos g


para confirmar o funcionamento do código.

Estudaremos mais sobre a árvore binária de busca e as diferentes formas de caminhamento ou percurso na
pró xima seção. Vejamos!

4.2 Árvore binária de busca

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 17/34
28/02/2023, 19:12 Estrutura de Dados

Uma árvore binária de busca é um tipo especial de árvore binária em que seguimos uma regra no momento de
definir o nó filho da esquerda ou da direita. Para tanto, inicialmente, precisamos definir um atributo-chave do
nó que será utilizado como comparação com os nó s já inseridos. Assim, a regra das árvores binárias de busca
diz que, para cada nó N da árvore, todos os nó s na subárvore da esquerda de N têm chave menor que 
“N.chave”; e todos os nó s na subárvore direita de N têm chave maior que “N.chave”. Como a árvore é uma
estrutura hierárquica, para atendimento dessa condição, temos que aplicá-la de forma recursiva até que o
novo nó seja inserido e a constituição da árvore ainda seja mantida (ZIVIANI, 2012).  

VOCÊ QUER VER?


O filme “O Jogo da Imitaçã o”, dirigido por Morten Tyldum, é baseado na história real do
cientista Alan Turing. O longo mostra como a Ciê ncia da Computaçã o foi importante
para a vitória dos aliados na Segunda Guerra Mundial, graças ao trabalho de um grupo
de cientistas liderados por Alan Turing, após serem contratados pelo governo inglê s
para desvendarem o segredo da má quina “Enigma”, utilizada pelos nazistas para
comunicações sigilosas. Vale a pena se aprofundar na temá tica da obra!

Vamos considerar uma árvore cujo elemento-chave de cada nó seja uma letra do alfabeto. Além disso,
devemos inserir os seguintes elementos na ordem definida: {S, C, A, X, R, Z}. Na figura a seguir, é apresentada a
inserção de cada um dos nó s passo a passo. 

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 18/34
28/02/2023, 19:12 Estrutura de Dados

Figura 11 - Inserção de nó em uma árvore de busca binária


Fonte: Elaborada pela autora, 2019.

#PraCegoVer: A imagem mostra uma representação visual de sequência de inserçõ es feitas em uma árvore de
decisão que vai do item a até o item f. Os nó s da árvores são representados por círculos e conteú do dos nó s
está representado por letras. A ligaçõ es dos nó s está representadas por setas que saem de um nó para o outro.
No item a temos um ú nico nó com letra S. No item b foi inserido um nó com a letra C ao lado esquerdo do nó
S. No item c foi inserido o nó A ao lado esquerdo do nó C. No item d foi inserido o nó X ao lado direito do nó S.
No item e foi inserido o nó R ao lado direito do nó C e por fim, no item f foi inserido o nó Z ao lado direito do
nó X.

Agora, aprenda mais sobre a inserção de nó em uma árvore binária clicando nos itens abaixo.

Observe que o primeiro nó inserido (S) é o nó


raiz da á rvore, apresentado em (a).

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 19/34
28/02/2023, 19:12 Estrutura de Dados

Em seguida, o nó C deve ser inserido na á rvore.


Como, na ordem alfabética, a letra C vem antes da
letra S e nã o tem um nó atrelado ao nó S à
esquerda, o nó C é inserido como o filho à
esquerda do nó S, apresentado em (b).

No passo (c), é inserido o nó A. Inicialmente, ele é


comparado com S. Como este é menor que A, ele
deve ser inserido no lado esquerdo. Como S já
tem um filho à esquerda, A é comparado com C.
Além disso, como A é menor que C e este é um nó
folha (nã o tem nó s filhos), A é inserido como filho
à esquerda de C.

O pró ximo nó a ser inserido é X. Como ele vem


apó s S, entã o é direcionado para a subá rvore da
direita. Como S nã o tem filho à direita, em (d), X é
inserido como filho à direita de S.

O pró ximo nó a ser inserido é R. Entã o, em (e), R


é comparado com S. Como R vem antes de S, ele é
direcionado para a subá rvore da esquerda.

Em seguida, é comparado com C. Como R é maior


que C, é direcionado para a subá rvore da direita.
O nó R é, entã o, inserido à direita de C, pois nã o
tem filho ocupando essa posiçã o.

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 20/34
28/02/2023, 19:12 Estrutura de Dados

Por fim, deve ser inserido o nó Z. Ele é


comparado com S. Pelo fato de Z ser maior que S,
ele é direcionado para a subá rvore da direita

Em seguida, Z é comparado com X. Como Z é


maior que X, ele é inserido como filho à direita de
X.
A implementação do algoritmo que realiza esse passo a passo de inserção de um novo nó em uma árvore de
busca está apresentada na figura na sequência. 

Figura 12 - Método para inserção de um nó em uma árvore binária de busca


Fonte: Elaborada pela autora, 2019.

#PraCegoVer: A imagem mostra um trecho de có digo de 16 linhas de programa. Enumerando cada linha
temos:

Linha 1: private No adicionaNo(No atual, char valor) {


Linha 2: if (atual == null) {
Linha 3: return new No (valor);
Linha 4: }
Linah 5:
Linha 6: // valor da ser inserido é menor que o nó corrente
Linha7: if (valor < atual.valor) {
Linha 8: atual.filhoEsquerda = adicionaNo(atual.filhoEsquerda, valor);
Linha 9: } else if (valor > atual.valor) { // valor a ser inserido é maior que corrente
Linha 10: atual.filhoDireita = adicionaNo(atual.filhoDireita, valor);
Linha 11: } else {
Linha 12: // valor já existe, não precisa adicionar novamente

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 21/34
28/02/2023, 19:12 Estrutura de Dados

Linha 13: return atual;


Linha 14: }
Linha 15: return atual;
Linha 16: }

O método “adicionaNo” recebe dois parâmetros: nó corrente (atual) e valor a ser adicionado (valor).  Observe
que o método é recursivo, pois, dentro da sua definição, há uma chamada ao pró prio método. O algoritmo,
então, percorre a árvore até encontrar o lugar onde o novo nó deve ser inserido. Quando o lugar é encontrado,
temos a situação em que o valor de atual é igual a null. Essa é, também, a condição de parada do algoritmo.
Enquanto não encontramos a posição em que o nó deve ser inserido, continuamos a busca, agora pelas
subárvores. Como existem duas subárvores (esquerda e direita), para saber qual subárvore deve ser
percorrida, é necessário fazer uma comparação do valor a ser inserido com aquele que está sendo visitado
(atual). Nessa comparação, podemos redirecionar a busca para a esquerda ou direita por meio de uma
chamada recursiva ao pró prio método.

VAMOS PRATICAR?
Utilizando o mesmo mecanismo apresentado na Figura 11, faça o esqu
inserçã o dos nós na á rvore na ordem inversa: {Z, R, X, A, C, S}. Crie cada
seis passos, utilizando como referê ncia o algoritmo apresentado anterio
Lembre-se de que é importante compreender o mecanismo de recur
presente nesse algoritmo

Nos itens na sequência, veremos três métodos para realizar o percurso em uma árvore binária de busca. Tais
métodos também são recursivos e comumente utilizados para a busca de um elemento em uma árvore binária
de busca. Importante observar que eles assumem que a árvore foi construída de acordo com o algoritmo da
ú ltima figura apresentada, pois, assim, foi adotada uma regra na inserção dos nó s na árvore.

4.2.1 Pré-ordem
Percorrer ou realizar o percurso em uma árvore em pré-ordem significa fazer a busca sob a seguinte ordem:

• visitar o nó raiz da subárvore corrente;


• percorrer a subárvore da esquerda em pré-ordem;
• percorrer a subárvore da direita em pré-ordem.

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 22/34
28/02/2023, 19:12 Estrutura de Dados

Temos, ainda, que visitar um nó significa realizar algum tipo de ação sobre ele, como comparar o seu valor
com um valor procurado.
A implementação do método que realiza a busca em pré-ordem está apresentada na figura a seguir. Recebemos
como parâmetro o nó atualmente visitado e o nó com uma chave utilizada como elemento de comparação. 

Figura 13 - Busca em pré-ordem


Fonte: Elaborada pela autora, 2019.

#PraCegoVer: A imagem mostra um trecho de có digo de 16 linhas de programa. Enumerando cada linha
temos:

Linha 1: private String procuraPreOrdem(No atual, No procurado){


Linha 2: if (atual.getChace().equalsIgnoreCase(procurado.getChave())) {
Linha 3: return procurado.getValor();
Linha 4: }
Linha 5:
Linha 6: if(atual.getFilhoEsquerda!=null)
Linha 7: {
Linha 8: procuraPreOrdem(no.getFilhoEsquerda());
Linha 9: }
Linha 10:
Linha 11: if(atual.getFilhoDireita!=null)
Linha 12: {
Linha 13: procuraPreOrdem(no.getFilhoDireita());
Linha 14: }
Linah 15:
Linha 16: return null;

Observe que, inicialmente, o nó raiz é passado como o nó atual do método “procuraPreOrdem”. Quando o
elemento-chave é encontrado, podemos retornar o valor associado ao nó .

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 23/34
28/02/2023, 19:12 Estrutura de Dados

4.2.2 Ordem simétrica ou in-ordem


Percorrer ou realizar o percurso em uma árvore em ordem simétrica significa fazer a busca sob a seguinte
ordem:

• percorrer a subárvore da esquerda em ordem simétrica;


• visitar o nó raiz da subárvore corrente;
• percorrer a subárvore da direita em ordem simétrica.
A implementação do método que realiza a busca em ordem simétrica está apresentada na figura na sequência.

Figura 14 - Busca em ordem simétrica


Fonte: Elaborada pela autora, 2019.

#PraCegoVer: A imagem mostra mostra um trecho de có digo de 16 linhas de programa. Enumerando cada
linha temos:

Linha 1: private String procuraOrdemSimetrica(No atual, No procurado) {


Linha 2: if (atual.getFilhoEsquerda!=null)
Linha 3: {
Linha 4: procuraOrdemSimetrica(no.getFilhoEsquerda());
Linha 5: }
Linha 6:
Linha 7: if (atual.getChave().equalsIgnoreCase(procurado.getChave())) {
Linha 8: return procurado.getValor();
Linha 9: }
Linha 10:
Linha 11: if(atual.getFilhoDireita!=null)
Linha 12: {
Linha 13: procuraOrdemSimetrica(no.getFilhoDireita());
Linha 14: }

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 24/34
28/02/2023, 19:12 Estrutura de Dados

Linha 15:
Linha 16: return null;

Na seção seguinte, veremos um método de busca em árvores binárias com uma priorização pela busca nas
subárvores, em comparação com a pelo nó raiz.

4.2.3 Pós-ordem
Por fim, percorrer ou realizar o percurso em uma árvore em pó s-ordem significa fazer a busca sob a seguinte
ordem:

• percorrer a subárvore da esquerda em pós-ordem;


• percorrer a subárvore da direita em pós-ordem;
• visitar o nó raiz da subárvore corrente.

Figura 15 - Busca em pó s-ordem


Fonte: Elaborada pela autora, 2019.

#PraCegoVer: A imagem mostra um trecho de có digo de 16 linhas de programa. Enumerando cada linha
temos:

Linha 1: private String procuraPosOrdem(No atual, No procurado){


Linha 2: if(atual.getFilhoEsquerda!=null)
Linha 3: {
Linha 4: procuraPosOrdem(no.getFilhoEsquerda());
Linha 5: }
Linha 6:
Linha 7: if(atual.getFilhoDireita!=null)
Linha 8: {

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 25/34
28/02/2023, 19:12 Estrutura de Dados

Linha 9: procuraPosOrdem(no.getfilhoDireita());
Linha 10: }
Linha 11:
Linha 12: if (atual.getChave().equalsIgnoreCase(procurado.getChave())) {
Linha 13: return procurado.getValor();
Linha 14: }
Linha 15:
Linha 16: return null;

A implementação do método que realiza a busca em pó s-ordem está apresentada na figura anterior, como
pudemos observar.

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 26/34
28/02/2023, 19:12 Estrutura de Dados

CASO
Como pudemos ver, a açã o de visitar um nó durante o percurso em uma á rvore
biná ria de busca pode ser feito a partir de ações diversas. Aqui, vamos utilizar o
percurso em pré -ordem para remover determinado nó da á rvore, em vez de
apenas retornar o seu valor.

O primeiro passo da remoçã o é encontrar o elemento que queremos remover.


Veja o trecho de código a seguir.

#PraCegoVer: A imagem mostra um trecho de código de 16 linhas de programa.


Enumerando cada linha temos.

Linha 1: private Node removaRecursivamente(node atual, int valor) {


Linha 2: if (atual == null) {
Linha 3: return null;
Linha 4: }
Linha 5:
Linha 6: if (valor == atual.valor) {
Linha 7: // o nó a ser removido foi encontrado
Linha 8: // … o restante do código para remover virá aqui
Linha 9: }
Linha 10: if (valor < atual.valor) {
Linha 11: atual.filhoEsquerda = removaRecursivamente(atual.filhoEsquerda,
valor);
Linha 12: return atual;
Linha 13: }
Linha 14: atula.filhoDireita = removaRecursivamente(atual.filhoDireita, valor);
Linha 15: return atual;
Linha 16: }

Após fazermos a remoçã o, é preciso garantir que a regra utilizada na inserçã o dos
elementos nã o seja violada. Para isso, temos que considerar trê s possíveis
cená rios: o nó removido é um nó folha, ou seja, nã o tem filhos; o nó removido tem
apenas um filho; ou o nó removido tem dois filhos.

No primeiro caso, é necessá rio apenas remover o elemento, conforme figura a


seguir.

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 27/34
28/02/2023, 19:12 Estrutura de Dados

#PraCegoVer: A imagem mostra um trecho de código de 3 linhas de programa.


Enumerando cada linha temos:

Linha 1: if (atual.filhoesquerda == null && atual.filhoDireita == null) {


Linha 2: return null;
Linha 3: }

No segundo caso, temos que retornar o filho do nó removido, pois ele será o novo
nó filho.

#PraCegoVer: A imagem mostra um trecho de código de 4 linhas de programa.


Enumerando cada linha temos:

Linha 1: private int encontreMenorValor(No raiz) {


Linha 2: return raiz.filhoEsquerda == null ? raiz.valor :
Linha 3: encontreMenorValor(raiz.filhoEsquerda);
Linha 4: }

Para tratar o terceiro cená rio, quando o nó a ser removido tem dois filhos, vamos
considerar que o elemento que assumirá a posiçã o do nó removido é aquele com
o menor valor da subá rvore da direita do nó a ser removido. O trecho de código
na sequê ncia retorna o valor desse elemento.

#PraCegoVer: A imagem mostra um trecho de código de 4 linhas de programa.


Enumerando cada linha temos:

Linha 1: int menorValor = encontreMenorValor( atual.filhoDireita);


Linha 2: atual.valor = menorValor;
Linha 3: atual.filhoDireita = removaRecursivamente (atual.filhoDireita,
menorValor);
Linha 4: return atual;

Por fim, temos que assinalar o menor valor ao nó corrente.

#PraCegoVer: A imagem mostra um trecho de código de 4 linhas de programa.


Enumerando cada linha temos:

Linha 1: int menorValor = encontreMenorValor( atual.filhoDireita);


Linha 2: atual.valor = menorValor;

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 28/34
28/02/2023, 19:12 Estrutura de Dados

Linha 3: atual.filhoDireita = removaRecursivamente (atual.filhoDireita,


menorValor);
Linha 4: return atual;

Assim, conseguimos concluir nossa operaçã o.

A figura na sequê ncia apresenta o código completo da operaçã o de remoçã o de


um nó de uma á rvore biná ria.

#PraCegoVer:
#PraCegoVer: A imagem mostra um trecho de código de 39 linhas de programa.
Enumerando cada linha temos:

Linha 1: private Node removaRecursivamente(Node atual, int valor) {


Linha 2: if (atual == null) {
Linha 3: return null;
Linha 4: }
Linha 5:
Linha 6: if (valor == atual.valor) {
Linha 7: // o nó a ser removido foi encontrado
Linha 8: // o caso 1
Linha 9: if (atual.filhoEsquerda == null && atual.filhoDireita == null) {
Linha 10: return null;
Linha 11: }
Linha 12:
Linha 13: // caso 2
Linha 14: if (atual.filhoDireita == null) {
Linha 15: return current.left;
Linha 16: }
Linha 17:
Linha 18: if (atual.filhoEsquerda == null) {
Linha 19: return current.right;
Linha 20: }
Linha 21:

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 29/34
28/02/2023, 19:12 Estrutura de Dados

Linha 22: // caso 3


Linha 23: int menorValor = encontreMenorValor(atual.filhoDireita);
Linha 24: atual.valor = menorValor;
Linha 25: atual.filhoDireita = removaRecursivamente(atual.filhoDireita,
menorValor);
Linha 26: return atual;
Linha 27: }
Linha 28:
Linha 29: if (valor < atual.valor) {
Linha 30: atual.filhoEsquerda = removaRecursivamente(atual.filhoEsquerda,
valor);
Linha 31: return atual;
Linha 32: }
Linha 33: atual.filhoDireita = removaRecursivamente(atual.filhoDireita, valor);
Linha 34: return atual;
Linha 35: }
Linha 36:
Linha 37: private int encontreMenorValor(No raiz) {
Linha 38: return raiz.filhoEsquerda == null ? raiz.valor :
encontreMenorValor(raiz.filhoEsquerda);
Linha 39: }

Além desses três métodos, outro conceito essencial para nossos estudos é o de árvore AVL. Vamos conhecer
sobre ele e entender suas aplicaçõ es no item a seguir. Acompanhe!

4.2.4 Árvore AVL


Uma árvore binária é denominada “AVL” quando, para qualquer nó nela inserido, as alturas de suas duas
subárvores (esquerda e direita) diferem em mó dulo de até uma unidade. O nome AVL vem de seus criadores
soviéticos Adelson Velsky e Landis. Esse tipo de árvore binária tem melhor performance nos algoritmos de
percurso, justamente pela sua característica de formação (ZIVIANI, 2012).

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 30/34
28/02/2023, 19:12 Estrutura de Dados

VOCÊ QUER LER?


Uma leitura interessante sobre as á rvores é a apostila escrita pelos professores W.
Celes e J. L. Rangel. No arquivo, os autores explicam melhor sobre as á rvores biná rias e
á rvores gené ricas. Vale a pena acessar o material e se aprofundar melhor na temá tica.
A apostila está disponível na íntegra por meio do link: 
http://www.ic.unicamp.br/~ra069320/PED/MC102/1s2008/Apostilas/Cap13.pdf
(http://www.ic.unicamp.br/~ra069320/PED/MC102/1s2008/Apostilas/Cap13.pdf ).
(http://calhau.dca.fee.unicamp.br/wiki/images/0/01/EstruturasDados.pdf )

As figuras a seguir apresentam exemplos de árvores AVL. 

Figura 16 - Exemplos de árvore AVL


Fonte: Elaborada pela autora, 2019.

#PraCegoVer: A imagem mostra 4 exemplos de árvores AVL. Os nó s da árvores são representados por
círculos e conteú do dos nó s está representado por letras. A ligaçõ es dos nó s está representadas por setas que
saem de um nó para o outro. O primeiro exemplo mostra um ú nico nó com a letra S. O segundo exemplo
mostra um nó com a letra S e ao seu lado direito tem outro nó com a letra X. O terceiro exemplo mostra um nó
com a letra S, ao lado esquerdo tem outro nó com a letra S e do lado direito outro nó com a letra X. Por fim, no

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 31/34
28/02/2023, 19:12 Estrutura de Dados

ú ltimo exemplo temos um nó com a letra S e conectado ao seu lado esquerdo tem um nó com a letra C e
conectado ao lado direito do nó S tem um nó com a letra X. Ao lado direito do nó C tem um nó com a letra R.

Veja que, mesmo o nó com apenas a raiz ou um filho, já é uma árvore AVL. Observe, ainda, que a regra
relacionada com a altura das subárvores da esquerda e da direita é preservada nesses casos.
Já a figura na sequência nos mostra dois exemplos de árvore binárias que não são árvores AVL. Note que a
subárvore da esquerda tem um nível a mais que da direita nos dois casos.

Figura 17 - Exemplos de árvores binárias, mas que não são AVL


Fonte: Elaborada pela autora, 2019.

#PraCegoVer: A imagem mostra dois exemplos de árvores que são binárias mas não são AVL. Os nó s da
árvores são representados por círculos e conteú do dos nó s está representado por letras ou nú meros. A
ligaçõ es dos nó s está representadas por setas que saem de um nó para o outro.

No primeiro exemplo temos:

Um nó raiz com a letra R. Ao lado esquerdo desse nó está conectado o nó B e ao lado direito está conectado o
nó V. Ao lado direito do nó B está conectado o nó E e por fim, ao lado esquerdo do nó E está conectado o nó C.

No segundo exemplo temos:

Um nó raiz com o nú mero 15. Ao lado esquerdo do nó raiz temos um nó com o nú mero 5. Ao lado direito do
nó raiz temos um nó com o valor 20. Ao lado direito do nó 5 temo um nó com o valor 8 e ao lado direito do nó

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 32/34
28/02/2023, 19:12 Estrutura de Dados

20 temos um nó com o valor 25. Ao lado esquerdo do no 8 temos um nó com o valor 6 e ao lado direito do nó
8 temo um nó com o valor 9. Ao lado direito do nó 6 temos um nó com o valor 7.

Para compreender o processo de construção de uma árvore AVL, inicialmente, temos que entender o conceito
de árvore perfeitamente balanceada. Segundo Ziviani (2012), a árvore é dita perfeitamente balanceada quando
o mó dulo da diferença da altura das subárvores da esquerda e direita é menor ou igual a 1. Por este motivo, a
árvore AVL também é conhecida como árvore binária de busca balanceada. A principal vantagem dessa
propriedade é que o tempo médio de pesquisa, em que cada chave é igualmente provável de ser encontrada em
uma pesquisa, é menor em comparação com outras árvores binárias.
Encerramos aqui nossa unidade sobre árvores. Assim como as demais estruturas de dados, busque refazer os
exemplos, compilar e executar os có digos. A absorção do conteú do está diretamente ligada à quantidade de
exemplos diferentes que você tem acesso.

Síntese
Chegamos ao fim da ú ltima unidade da disciplina de Estrutura de Dados. Aqui, estudamos a respeito das
árvores binárias e AVL. Vimos que a forma de armazenamento e as operaçõ es disponíveis para cada uma delas
está diretamente relacionada ao comportamento esperado da aplicação. Além disso, também pudemos
aprender um exemplo prático de remoção de nó s na árvore binária, mantendo a sua estrutura.
Nesta unidade, você teve a oportunidade de:
• compreender que as estruturas de dados de árvore, com maior
enfoque nas árvores binárias, possuem certas características que
precisam ser mantidas no processo de inserção e de busca por um
elemento;
• entender o passo a passo da construção de uma árvore binária de
busca e os três algoritmos principais de percurso nesse tipo de
estrutura;
• identificar a diferença entre uma árvore binária e uma árvore AVL;
• compreender que os conceitos, apesar de teóricos, tentam imitar
as aplicações práticas do dia a dia;
• criar tipos completos em Java para construir árvores para
escopos distintos.

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 33/34
28/02/2023, 19:12 Estrutura de Dados

Bibliografia
ASCENCIO, A. F. G.; ARAÚ JO, G. S. Estrutura de dados: algoritmos, análise da complexidade e
implementaçõ es em Java e C/C++. São Paulo: Pearson, 2010.
CELES, W.; RANGEL, J. L. Árvores. Rio de Janeiro: PUC, 2008. Disponível em:
http://www.ic.unicamp.br/~ra069320/PED/MC102/1s2008/Apostilas/Cap13.pdf
(http://www.ic.unicamp.br/~ra069320/PED/MC102/1s2008/Apostilas/Cap13.pdf). Acesso em: 15 ago.
2019.
O JOGO DA IMITAÇÃ O. Direção de: Morten Tyldum. Estados Unidos: Diamond Films, 2015. 115 min. Color.
PUGA, S.; RISSETTI, G. Lógica de programação e estruturas de dados – Com aplicações em Java. 3. ed.
São Paulo: Pearson, 2010.
TAMASSIA, R.; GOODRICH, M. T. Estruturas de dados e algoritmos em Java. Porto Alegre: Grupo A, 2011.
ZIVIANI, N. Projeto de algoritmos: com implementaçõ es em JAVA e C++. 3. ed. São Paulo: Cengage Learning
Editores, 2012.

https://student.ulife.com.br/ContentPlayer/Index?lc=aMHRZfDfQLQzZ%2b6XMRv8Ww%3d%3d&l=VoUU3f%2fGDBH%2fwmRUF7jrow%3d%3… 34/34

Você também pode gostar