You are on page 1of 50
210812022 23:17 Unidade 4- Estutura de dados com orientagdo a objetos -unidade 4 ESTRUTURA DE DADOS COM ORIENTACAO A OBJETOS UNIDADE 4 - ESTRUTURA DE DADOS - ARVORES Autora: Ana Lucia Pegetti Revisor: Marcos Paulo Lobo De Candia Introdugao Caro estudante, © que vem a sua mente quando vocé pensa em uma arvore? Raizes, galhos e folhas? Da mesma forma, na ciéncia da computagdo, a estrutura de dados arvore tem raizes, galhos e folhas. Na ciéncia da computacéo, uma arvore é uma estrutura de dados hierdrquica que pode representar relacionamentos entre nés diferentes. Ao iniciar na area de programagao, é mais comum entender as estruturas de dados lineares, do que arvores e grafos. As arvores sao conhecidas como estruturas de dados nao lineares pois nao armazenam dados de forma jem varias apli linear, mas sim hierarquica, Exi \ges no mundo real para as drvores, que usam a relagdo entre varios nés usando a hierarquia pai-filho. Sao amplamente utilizadas para simplificar e agilizar as operagées de pesquisa e classificagéo de dados, sendo consideradas uma das estruturas de dados mais poderosas e avangadas. Existem varios tips de arvores no estudo das estruturas de dados e eles serao apresentados nesta unidade, Bons estudost 4.1 Arvores binarias Antes de falarmos especificamente sobre drvores binarias, apresentaremos alguns conceitos genéricos sobre a estrutura de dados arvore para melhor entendimento. hitpststudent.ulfe.com.briContentPlayer/index?le=plU vIpJ7YXIVIY7GWOSZA%3d%38I=ySdEfpMurHaig47%2dDKHLNW'3d%3d8cd= IN. 150 210812022 23:17 Unidade 4- Estutura de dados com orientagéo a objetos -unidade 4 Puga e Rissetti (2004, p.221) definem uma drvore como “uma estrutura de dados bi possui propriedades especi 908 como consulta, insergao, remocdo, entre outros’, sendo diferente de listas e pilhas, pois a rvore é uma estrutura de dados hierarquica e jensional, nao linear, que admite muitas operagées de conjuntos dindi no linear, definida recursivamente. E semelhante a uma lista encadeada, mas em vez de cada no simplesmente apontar para 0 préximo né de forma linear, cada né aponta para um niimero de nés. Neste tipo de estrutura, a ordem dos elementos ndo é importante. A Figura 1 mostra um exemplo de arvore. Arvore X No da arvore—— (AN Figura 1 ~ Representagle de uma drvore. Fonte: Elaborada pela autora, 2020. Bianchi et al (2014, p. 254) apresenta alguns conceitos relacionados aos elementos que constituem uma arvore: » Clique nas sotas ou arraste para visualizar as imagens Principal elemento da drvore. Nao apresenta ancestrais; todos os nés da drvore sdo seus descendentes (diretos ou indiretos). Na Figura 1, seria o né A. NO-PAI Elemento que apresenta descendentes na arvore, podendo ter um ou mais filhos; na Figura 1, seriam os nés B, C, D, Fe G. NO-FILHO Elemento que descende de algum outro né da drvore, tendo apenas um né pai. Na Figura 1, seriam os nés B, C, D, EF, G,H, |, JeK. NO FOLHA Né que nda anresenta descandentes Na Fiauira 1 seriamas nds F H | lak hitps:tstudent.ulfe.com.briContentPlayet/Index?le=plU vIpJ7YXIVIY7GWOSZA%:3d%3d8I=ySdETpMurHaig47%2DDKHLNWK3d%3d8cd=rSuN... 2450 210812022 23:17 Unidade 4 Estutura de dados com orientagéo a objetos -unidade 4 soe Sune sate pr eacnnte meray snnnn nsee niga uy NIVEL DE UMN O nivel do né raiz € 0 ( N= 0 ), eo nivel dos nés restantes é igual ao nivel do seu né pai acrescido de 1. Na figura 1, 08 nés B, C e D so de nivel 1 GRAU DE UM NO grau de determinado né é dado pelo ntimero de seus filhos. Na Figura 1, 0 né D teria grau 2, eondéF, grau1 GRAU DA ARVORE Uma érvore X tem grau igual ao grau maximo verificado para seus nés, ou seja, é igual ao do 16 que apresenta mais filhos. Na Figura 1, o grau da arvore é 3 ALTURA DE UM NO A altura de um né Bn igual a maior disténcia entreBn e um né folha que seja seu descendente. Na figura 1, a altura do né B, 6 2; e dond E 6 0, ALTURA DE UMA ARVORE Aaltura de uma drvore corresponde a altura do né raiz. Na figura 1, a altura do né raiz é 3 Tipos de arvores encontrados na literatura » Clique nas abas para saber mais sobre o assunto Arvore genérica Florestas Arvore bindria Arvore de pesquisa binaria Arvore de expressio Arvore de torneio Existem varias aplicagées para a estrutura de dados arvores . As mais populares estado listadas abaixo: + Armazenar informagdes que tém por natureza a estrutura de arvore como sistema de arquivos, érvores de sintaxe; + Armazenar dados para operagées de leitura, inclusao e exclusdo mais répidas; + Indexagao de dados nos bancos de dados; + Um tipo especial de arvore bindria chamada heap é ttl em HeapSort, fila de prioridade etc.; + Representagao de drvores de decisao em inteligéncia artificial, + Armazenar o texto e os atributos HTML em um DOM ( Document Object Model ) Especificamente, Puga e Rissetti (2004) definem uma drvore bindria como uma estrutura com nés com grau menor ou igual a 2, ou seja, nenhum né possui mais do que dois descendentes diretos (filhos) de forma que os nés da direita sempre possuem valor superior aos do né-pai. ¢ os nés da esauerda semore vossuam valor hitpststudent.ulfe.com.briContentPlayer/index?le=plU 7vipJ7YXIVIY7GWOSZA%:3d%3d8I=ySdETpMurHaig47%2DDKHLNWK3d%3dBcd=rSuN... 3450 210812022 23:17 Unidade 4- Estutura de dados com orientagso a objetos -unidade 4 inferior a0 né-pai Bianchi et al (2014) afirma que a drvore binaria é caracterizada como um conjunto finito vazio (ou ndo) de nés que sao apresentados na forma de um né raiz e seus descendentes, organizados em uma subarvore esquerda @ uma subdrvore direita, e podem ser classificadas em drvore estritamente binaria, érvore binéria completa arvore binaria quase completa. A Figura 2 apresenta a estrutura de uma arvore binaria. Figura 2~ Representagao de uma arvore binéria, Fonte: Elaborada pela autora, 2020, A arvore bindria 6 uma estrutura de dados especial usada para fins de armazenamento de dados e tem os beneficios de uma matriz ordenada e uma lista encadeada, pois a pesquisa é t&o rapida quanto em um (em inglés array ) ordenado e as operagées de insergao ou exclusdo sdo téo répidas quanto em uma lista encadeada, Classificagao das arvores binarias » Clique nas abas para saber mais sobre o assunto Arvore Arvore Arvore estritamente binaria binaria completa binaria quase completa Fonte: BIANCHI, F; FREITAS, R; JUNIOR, D. Estrutura de dados técnicas de programa: Elsevier Brasil, 2014 4.1.1 Implementacao de drvores bindrias Uma érvore binéria pode ser implementada com um array ou com uma lista encadeada. O uso de alocagao estética para a representagao de uma arvore indria ocorre por meio da distribuigdo dos nés da drvore ao longo de um vetor ( array ). Essa distribuigao ocorre da seguinte forma, segundo Bianchi et al. (2014): + Oné raiz fica na nasieda inicial do vetor (auii eansiderada OV hitps:tfstudent.ulfe.com.briContentPlayer/index?le=plU vpJ7YXIVIY7GWOSZA%:3d%3d8I=ySdETpMurHaig47%20DKHLNWK3d%3dBcd=FSUN... 450 ‘210612022 23:17 Unidad 4 Estrutura de dados com orentagSo a obelos -unidade 4 + para cada né em determinada posigao i do vetor, seu filho esquerdo ficard na posigao 2"i + 1 ( #PraCegoVer : dois vezes i mais um), ¢ seu filho direito ficard na posi¢ao 2*i + 2 ( #PraCegoVer : dois vezes i mais dois). A representagao do array é mais adequada para uma arvore bindria completa em que o desperdicio de meméria & minimo. As principais operagdes realizadas em uma arvore bindria séo busca (ou percurso), incluso & remogao. ‘Acompanhe, a seguir, a implementagao de uma Arvore bindria com array em Java’ IH mplementagao de uma arvore binaria em java utilizando array i numeragao de 0a n-1 import java.util"; import java. lan import java.io.*; 1 No método Main é inserido A como a raiz da arvore, apés isso B seria inserido a esquerda do né © Iidepois C inserido a direita do n6. Depois D seria inserido como o filho a esquerda de B e F como 0 Miho a direita, Para finalizar F seria inserido como filho de C a esquerda. class Arvore { public static void main(Stringl] args) { Array_imp obj = new Array_imp(); obj Raiz ("A"); 1 obj.set_Esq("B", 0); 11.0 comentério serve para nao inserir 0 né B a esquerda da arvore, exemplificando o que causaria o IIproblema para a insergao de D e E que esto sendo inseridos como filhos do né 1. Exemplo da Mocalizagéo dos nés: W O(a) a) 2(C) I 3D) 4(E) 5(F) 6(vazio) obj. set_Dir("C", 0); obj. set_Esq("D", 1); obj. set_Dir("E”, 1); obj. set_Esq("F", 2); bj. imprimir_Arvore(); } } class Array_imp { static int raiz = 0: Iitps:tfstudent. ulife.com.br/ContentPlayer/index?le=plU vipJ7YXIVIY7GWOSZA%3d%348I=ySdETpMurHain47%2dDKHLNWIK3d%3dBcd=rSuN... 5/50 Unidade 4- Estutura de dados com orientagdo a objetos -unidade 4 static Stringl] str = new String[10]; Proriagdo da raiz"/ public void Raiz(String chave) { str[0] = chave; } Proria o filho do lado esquerdo da raiz"/ public void set_Esq(String chave, int raiz) { int t= (raiz * 2) +1; if (strfraiz] == null) { ‘System.out.printf("Nao pode atribuir o filho a %d, nao foi encontrado palin’, } else { str] = chave; } } Moria 0 filho direito da raiz‘ public void set_Dir(String chave, int raiz) { int t= (raiz* 2) + if (striraiz] ull) { ‘System. out printf("Nao pode atribuir o filho a %d, nao foi encontrado palin", t); } else { str{t] } } public void imprimir_Arvore() /! impressao na pré-ordem { for (int i= 0; i < 10; i++) { if (str) ‘System.out print(str{i]); null) else ‘System.out print("-" } } } IICriacdo da classe No hitps:tfstudent.ulfe.com.br/ContentPlayer/index?le=plU ¥IpJ7YXIVIY7GWOSZA%3d%348I=ySdETpMurHain47%2dDKHLNWIK3d%3dBcd=rSuN... 6/50 21082022 23:17 Unidad 4- Estutura a dados com orientagio a objetos -unidade 4 public class No { private Integer dado; private No eFilho; private No dFilho; public No() { Ise encontrar um valor nulo, 0 sistema sabe que é 0 fim da arvore neste lado eFilho = dFilho = null; dado = nul; } public Integer getDado() { return dado; } public void setDado(Integer dado) { this.dado = dado; } Public No getEFitho() { return eFitho; } Public void setEFilho(No eFitho) { this.eFilho = eFilho; } Public No getDFilho() { return dFitho; } public void setDFilho(No dFilho) { this. dFilho = dFilho; } } Para a implementagdo em alocagao dinai (listas encadeadas), deve-se definir um registro contendo trés campos basicos: um para armazenar o contetido do né, uma para a ligagao esquerda (né-filho a esquerda) outro para a ligagao direita (né-filho a direita) (BIANCHI et al., 2014). Acompanhe, a seguir, a implementagao de uma arvore bindria com alocagdio dinamica: Il€ste cédigo representa a implementacao de uma rvore com alocagao dinamica /* O método incluir recebe um dado e verifica se a raiz é nula. Se for nula, significa que ndo tem nada na arvore, cria um né e seta 0 dado desse né com 0 valor que passou para o método, seta a raiz com esse né, e retorna o valor. Sendo, faz a incluso recursiva do dado a partir da raiz (recebe 0 né e o dado), criando um né para guardar 0 novo dado que se quer inserir, seta a raiz do dado com o valor do dado e verifica se a raiz é nula, entéo precisa chamar ‘© método de incluso, que cria uma nova raiz. Se o valor inserido for menor que o né atual - raiz, 0 valor vai para a esquerda, se for maior, o dado vai para a direita. */ public class ArvoreDin { private No raiz: hitps:tstudent.ulife.com.br/ContentPlayer/index?le=pIU vpJ7YXIVIY7GWOSZA%.3d%348I=ySdETpMurHain47%2dDKHLNWIK3d%3dBcd=rSuN... 7/50 ‘2106'2022 23:17 Unidad 4 Estrutura de dados com orientagSo a obelos -unidade 4 private int contador; public void incl{Integer dado) { null) { No n= new No); n.setDado(dado); raiz if (raiz return; Jelse { recursivolncl(raiz, dado); } } IA recursividade se dé, nesse caso, com uma chamada interna do proprio II método no qual ela esta inserida. public void recursivoincl(No raiz, Integer dado) { No n= new No); n.setDado(dado); if (raiz == null) { ‘System.out.printin("“A raiz de adigao recursiva 6 nula "); return; } if (dado < raiz.getDado()) { if (raiz.getEFilho( ull) { raiz.setEFilho(, return; }else { recursivolncl(raiz.getEFillho(), dado); } yelse { if (raiz. getDFilho() raiz.setDFilho(n); return; Jelse { recursivolncl(raiz.getDFilho(), dado): yo } } I” método emOrdem tem duas variantes: um recebe 0 né e outro que nao recebe valor nenhum, que é 0 inicial, e chama o método recursivo emOrdem passando a raiz. Se raiz for nula ele para (porque é a condicao da recursividade), sendo ele chama emOrdem passando 0 filho e depois imprime o valor da raiz, e chama ‘emOrdem passando o valor do né da direita. imorimindo de acordo com a ordem de naveaaco da drvore. 0 hitps:tstudent.ulite.com.briContentPlayer/index?le=plU vpJ7YXIVIY7GWOSZA%.3d%348I=ySdETpMurHain47%2dDKHLNWE3q%3d8cd=rSuN... 8/50 21082022 23:17 Unidade 4- Estutura de dados com orientagSo a objetos -unidade 4 mesmo se aplica ao método preOrdem e posOrdem, alterando somente a ordem de impressao dos dados das subarvores ” I para impresséio em ordem public void emOrdem() { emOrdem (raiz); ‘System.out printin(); } private void emOrdem(No raiz) { if (raiz == null) { return; } ‘emOrdem (raiz.getEFilho()); ‘System.out.print(raiz.getDado() + ‘emOrdem (raiz.getDFilho()); } IHimpressao pre ordem Public void preOrdem() { preOrdem(raiz); ‘System.out.printin(); } private void preOrdem(No raiz) { if (rai vull) { retum; } ‘System.out print(raiz.getDado() + preOrdem(raiz.getEFilho()); preOrdem(raiz.getDFllho()); } HHimpressao pés ordem public void posOrdem() { posOrdem(raiz): ‘System.out printin(); } private void posOrdem(No raiz) { if (raiz == null) { return; } posOrdem(raiz.getEFilho()); posOrdem(raiz.getDFilho()); ‘System.out.print(raiz.getDado() +" "); } I*O buscar recebe um dado e verifica se a raiz é nula. retorna falso (condicdo de parada): se a raiz nao for Iitps:fstudent.ulfe.com.br/ContentPlayer/index?le=pIU vipJ7YXIVIY7GWOSZA%3d"348l=ySdE Tp MurHaigd7%2bbKHLNW'3q7%3d8cd=rSuN 9150 21082022 23:17 Unidad 4 Estutura da dados com orientagio a objetos -unidade 4 nula, faz retomo da busca recursiva passando raiz e dado como parametro. Verifica se a raiz for igual ao valor atual, encontrou o valor na arvore. Se nao foi encontrado valor na arvore, entao continua a busca, pois significa que podem haver descendentes na subérvore direita ou na subérovre esquerda, chamando a busca na esquerda e fazendo a busca até encontrar ou chegar ao fim da varredura na drvore. Trata as impressées dos valores dos elementos da drvore*/ I procura um né public boolean buscar(Integer dado) { if (raiz!= null) { return recBusca(raiz, dado); }else { return false; } } private boolean recBusca(No raiz, Integer dado) { I parar if (raiz == null) { retum false; } Hachou if (raiz.getDado(),equals(dado)) { return true; } 11 continua procurando boolean encontrouEsq = recBusca(raiz get€Filho(), dado); if (encontrouEsq) { return true; } return recBusca(raiz.getDFilho(), dado); } String retorno; public void toStringEmOrdem(No raiz) { if (rai ull) { return; } toStringEmOrdem(raiz. getEFilho()): I System.out printin(raiz.getDado()); retorno += "" + raiz.getDado); toStringEmOrdem(raiz. getDFilho()); MDemonstragao do cédigo public static void main(String] args) { ArvoreDin a = new ArvoreDin(); a.inol(1); /inclusao dos elementos na arvore ancl: Iitps:tfstudent.ulfe.com.briContentPlayer/index?le=plU vpJ7YXIVIY7GWOSZA%3d%348l-ySdETpMurHaigd7*&2bbKHLNW'3d73d8cd=Su, 10150 21082022 23:17 Unidad 4 - Estutura ge dados com orientagio a objetos -unidade 4 a.incl a.incl ancl (6) (7) (2) ainol(3); ainel(4) a preOrdem(); /imprimir elementos da arvore em pré ordem a.posOrdem(); // imprimir elementos da arvore em pés ordem a.emOrdem(); // imprimir elementos da arvore em ordem ‘System.out printin(a.buscar(4)); //procurar elemento que esta na arvore ‘System.out printin(a.buscar(14)); //procurar elemento que nao esta na arvore} Bianchi et al. (2014) alerta que, embora a alocagao estatica oferega maior simplicidade na manipulacéo de um vetor, ela pode desperdi¢ar espago de armazenamento no caso de nés vazios. Ja a alocagao dinamica se apresenta de forma oposta, com manipulagéo mais complexa da estrutura de armazenamento, mas com eliminagao do desperdicio verificado na alocagao estatica Nos cédigos apresentados neste tépico, ambos implementam drvores, mas 0 primeiro implementa com uma quantidade fixa de nés ma 10 enquanto o segundo implementa com uma quantidade dinamica de nuimeros de nés. Basicamente um aloca o espago de meméria na inicializagdo 0 outro vai alocando a cada insergéo na arvore, dinamicamente. Para finalizar este t6pico, é importante apresentar um caso especial de Arvore binéria: a arvore de pesquisa bindria. A Figura 3 ilustra uma drvore de pesquisa bindria com 12 valores de inteiro. A forma da arvore de pesquisa bindria que corresponde a um conjunto de dados pode variar, dependendo da ordem em que os valores so inseridos na rvore. 47 25 77 "1 43 65 93 7 17 3 44 68 Figura 3 Representagao de uma arvore binéria, Fonte: DEITEL; DEITEL, 2017, p. 698 Deitel e Deitel (2017, p.698), definem uma arvore binaria de busca da seguinte forma: Uma arvore de pesquisa binaria (sem valores de né duplicados) tem a caracteristica de hitps:student.ulfe.com.br/ContentPlayer/index?le=plU 7vpJ7YXIVIY7GWOSZA%3d%348I=ySdETpMurHain47%K2dDKHLNWIK3d%SdBcd=rSu,.. 11/50 210812022 23:17 Unidade Estrutura 6e dados com orentagSo a obelos -unidade 4 que os valores em qualquer subérvore esquerda sao menores que o valor no né pal dessa subérvore e os valores em qualquer subarvore direita so malores que o valor no né pai dessa subarvore. A rvore de pesquisa bindria (ou arvores bindrias de busca, em inglés binary search tree — BST) é uma arvore binaria ordenada. Todos os elementos na subarvore esquerda séo menores que a raiz, enquanto os elementos presentes na subarvore direita so maiores ou iguais ao elemento do né raiz. Assim, para localizar o né de menor valor dentro de uma drvore binaria de busca, partindo do principio que todo né do lado esquerdo 6 menor que seu né-pai, realiza-se 0 percurso visitando todos os nés das subdrvores esquerdas subsequentes até chegar ao né folha, ou seja, tilimo né esquerdo, A mesma ideia é adotada para localizar 0 nd de maior valor, porém visitando todos os nés das subarvores direita subsequentes até chegar ao né folha, Trata-se de uma estrutura de dados muito utilizada na computagao, combinando vantagens do array ordenado, pois permite realizar buscas de forma rapida e da lista encadeada, permitindo, assim, realizar operagdes de insergao © exclusao de itens rapidamente, Arvores de pesquisa bindrias so usadas na maioria das aplicagdes do dominio da Ciéncia da Computago, como pesquisa, classificacao, construcao de expressées aritméticas etc. Observe na Figura 4 a representagao de uma arvore ia de busca Figura 4 ~ Representaedo da rvore bindria de busca. Fonte: Elaborado pela autora, 2020, Na Figura 4, 6 possivel observar que 20 é 0 né raiz desta drvore. A subérvore esquerda possui todos os valores de nés menores que 20. A subarvore direita possui todos os nés maiores que 20. O BST leva tempo O(log n) para pesquisar um elemento. Conforme os elementos sdo ordenados, metade da subdrvore é descartada em todas as etapas durante a busca por um elemento. Isso se torna possivel porque pode-se determinar facilmente a localizagéo aproximada do elemento a ser pesquisado. Da mesma forma, as operagées de insergdo & excluséo so mais eficientes no BST. Quando se quer inserir um novo elemento, se tem uma ideia em qual subarvore (esquerda ou direita) iremos inserir 0 elemento. Formas de representacao de uma arvore Iitps:tstudent.ulfe.com.briContentPlayer/index?le=plU ¥IpJ7YXIVIY7GWOSZA%3d%38I=ySdEfpMurHaig47%2dbKHLNW'3d%3d8cd= 12150 ra10si2 Fonte - BIANCH, Francisco: FREITAS, Ricardo; JUNIOR, Dilermand. Estrutura de dados e técnicas de programagdo . Elsev 022 23:17 Unidade 4- Estutura de dados com orientagdo a objetos -unidade 4 » Clique nas abas para saber mais sobre o assunto Existem algumas vantagens em se utilizar as arvores de busca binaria: Brasil, 2014, + A pesquisa mais eficiente uma vez que se obtém, em cada etapa, uma dica sobre qual subérvore contém 0 elemento desejado; + E considerada uma estrutura de dados eficiente em comparagao com arrays e listas encadeadas. No + Acelera as operagées de insergao e exclusdo em comparagao com o array e a lista encadeada. proceso de pesquisa, ela remove metade da subarvore em cada etapa: As principais operagdes que podem ser realizadas com as drvores de pesquisa binaria so: pesquisa, inclusdo e excluséo de elementos na érvore. © programa a seguir, em Java, fornece uma demonstragao dessas operagées na Arvore binaria de busca: class BST_classe { IIclasse No que define 0 né do BST class No { int chave; No esq, dir, public No(int dado){ chave = dado; esq = dir = null; } } JING raiz No re II Construtor para BST => drvore vazia inicial BST_classe(){ raiz = null; } Iexclua um né do BST void excluiChave(int chave) { raiz = exclui_Recursivo(raiz, chave); } IH fungao de exclusao recursiva No exclui_Recursivo(No raiz, int chave) { Ilarvore esta vazia binary Search tree hitps:tfstudent.ulte.com.br/ContentPlayer/index?le=plU ¥pJ7YXIVIY7GWOSZA%3d%348I=ySdETpMurHain47%2dDKHLNWIK3A%BdBcd=rSu,.. 13/50 21082022 23:17 Unidad 4 - Estutura ge dados com orientagio a objetos -unidade 4 it raz == nun) return raiz; Il atravessa a arvore (percurso) if (chave < raiz.chave) I atravessa a subarvore esquerda raiz.esq = exclui_Recursivo(raiz.esq, chave); else if (chave > raiz.chave) // atravessa a subarvore direita raiz.dir = exclui_Recursivo(raiz.dir, chave); else { I/n6 contém somente um descendente null) if (raiz.esq return raiz.dir; else if (raiz.dir return raiz.esq; null) IIn6 tem dois descendentes IL obtém o sucessor em ordem (valor minimo na subarvore direita) raiz.chave = minValue(raiz.dir); I Exclui o sucessor em ordem raiz.dir = exclui_Recursivo(raiz.dir, raiz.chave); } return raiz; } int minVal(No raiz) { Hinicialmente minval = raiz int minval = raiz.chave; HH encontrar minval while (raiz.esq != null) { minval = raiz.esq.chave; raiz = raiz.esq; } return minval; } inserir um né no BST void inserir(int chave) { raiz = inserir_Recursivo(raiz, chave); } I fungo de inclusao recursiva No inserir_Recursivo(No raiz, int chave) { Ilarvore esta vazia null) { raiz = new No{chave': if (raiz Iitps:sfstudent.ulfe.com.br/ContentPlayer/index?le=plU vpJ7YXIVIY7GWOSZA%3d%348l-ySdETpMurHaigd7%&2dbKHLNW'3d73d8cd= Su, 14150 21082022 23:17 Unidad 4 - Estutura ge dados com orientagio a objetos -unidade 4 return raiz; I atravessa a rvore if (chave < raiz.chave) /! inserir na subarvore esquerda raiz.esq = inserir_Recursivo(raiz.esq, chave); else if (chave > raiz.chave) // inserir na subérvore direita raiz.dir = inserir_Recursivo(raiz.dir, chave); I retoma indice return raiz; } II método para travessia em ordem de BST void emordem() { ‘emordem_Recursivo(raiz); } Il atravessa 0 BST de forma recursiva void emordem_Recursivo(No raiz) { if (raz != mull { ‘emordem_Recursivo (raiz.esq): ‘System.out.print(raiz.chave + ‘emordem_Recursivo (raiz.dir } } boolean buscar(int chave) { raiz = busca_Recursiva(raiz, chave); if (raiz\= null) return true; else return false; } I fungo de incluso recursiva No busca_Recursiva(No raiz, int chave) { II Casos basicos: a raiz é nula ou a chave esté presente na raiz if (raiz==null || raiz.chave: ‘chave) return raiz; val 6 maior do que a chave da raiz if (raiz.chave > chave) return busca_Recursiva(raiz.esq, chave); val 6 menor do aue a chave da raiz Iitps:tfstudent.ulfe.com.briContentPlayer/index?le=plU TvpJ7YXIVIY7GWOSZA%3d%348l-ySdETpMuraigd7&2dbKHLNW'3d73d8cd=Su 15150 21082022 23:17 Unidad 4 - Estutura ge dados com orientagio a objetos -unidade 4 return busca_Recursiva(raiz.dir, chave); } } class Main{ public static void main(Stringl] args) { Icria um objeto BST BST_classe bst = new BST_classe(); I" Exemplo de arvore BST 45 nN 10 90 Wd 7 12.50 "7 Ilinsere dados na arvore bst.inserir(45); bstinserir (10); bstinserir (7); bst.inserir (12); bstinserir (90); bst.inserir (50); Iimprime a arvore ‘System.out.printin("Esta é a Arvore criada com os dados de entrada (esq-raiz-dir)"); bst.emordem(); Hexclui o né folha ‘System.out printin("\nA drvore apés a exclusao do né 12(né folha):"); bst.excluiChave(12); bst.emordem(); Hexclui 0 né com um descendente ‘System.out printin("\nA arvore apés a exclusao do né 90 (né com 1 descendente):"): bst.excluiChave(90); bst.emordem(); Ilexclui o né com dois descendentes ‘System.out printin("\nA drvore apés a exclusdo do né 45 (né com 2 descendentes):"); bst.excluiChave(45); bst.emordem(); Ilpesquisa uma chave na arvore boolean re_val = bst. buscar (50); ‘System.out printin("\nChave 50 encontrada na drvore em:" + re_val ); re_val = bst buscar (12); ‘System.out.printin("\nChave 12 encontrada na arvore em:" + re_val); } y hitps:student.ulfe.com.br/ContentPlayer/index?le=plU TvipJ7YXIVIY7GWOSZA%3d%348I=ySdETpMurHain47%2dDKHLNWIK3A%BdBcd=rSu,.. 16/50 210812022 23:17 Unidade 4- Estutura de dados com orientagdo a objetos -unidade 4 VOCE QUER LER? Para aprofundar seus conhecimentos sobre arvores bindrias, leia os Capitulos 12 e 13 do livro Algoritmos: teoria e pratica (Wirth, 1989). Esse livro cobre em profundidade uma ampla faixa de algoritmos, de maneira acessivel aos leitores de todos os niveis. Teste seus conhecimentos Aividade nao pontuada. 4.2 Arvores AVL A arvore AVL é uma dtvore de pesquisa bindria na qual a diferenca de alturas das subarvores esquerda e direita de qualquer né ¢ menor ou igual a um. A técnica de balancear a altura das dtvores binérias foi desenvolvida por Adelson, Velskii ¢ Landi e, por isso, recebeu a forma abreviada de arvore AVL ou Arvore Bindria Balanceada Bianchi et al. (2014, p.317), assim define as arvores bindrias balanceadas: As rvores AVL sao Arvores bindrias em que a distribuicdo dos elementos é feita respeitando determinadas condigées que vao garantir o balanceamento dessa arvore. Numa arvore AVL, o balanceamento é definido a partir das alturas das subarvores nela existentes. Nesse tipo de rvore, a diferenga entre as alturas das subérvores esquerda e direita de qualquer né 6 de no maximo 1, ou seja, se a altura da subarvore esquerda é N, entdo, a altura da subérvore direita sera igual aN, N-1 ou N+1 ( #PraCegoVer : n,n menos um ou n mais um). Para garantit 0 balanceamento, é necessério que apés a insergéio ou remogao de um elemento, seja verificado se a condigao de balanceamento por altura se mantém e se a ordenagao das chaves nao é afetada, mesmo que as operagées basicas das arvores AVL sejam as mesmas de uma arvore bindria qualquer. hitps:tstudent.ulfe.com.briContentPlayer/index?le=plU ¥IpJ7YXIVIY7GWOSZA%3d%348I=ySdEfpMurHaig47%2bDKHLNW'3d%3d8cd= 17150 210812022 23:17 Unidade 4- Estutura de dados com orientagdo a objetos -unidade 4 Agora que vocé jé conhece um pouco sobre arvores bindrias com suas caracteristicas e operacées, pratique a légica e indique os percursos na ordem, pré-ordem e pés-ordem da arvore de pesquisa binéria, implementando esses percursos na linguagem Java: 49 pit pi 18 40 m1 97 1 19 32448972 92 99 Como as drvores AVL séo Arvores de equilibrio de altura, operagdes como insergao e exclusdo tém baixa complexidade de tempo. Ela nunca excede (1,44 log n ) em altura, 0 que, mesmo no pior caso, 0 tempo de pesquisa sera da ordem de O(log n) . Uma consequéncia do balanceamento é que a altura 6 logaritmica no numero de chaves. De forma genérica e simplificada, podemos definir a implementagao das arvores AVL com os seguintes algoritmos para incluso e exclusdo. » Etapas para a exclusdo 1. Primeiro, insira um novo elemento na arvore usando a légica de insergao da drvore de pesquisa binaria; 2, Apés inserir 08 elementos deve-se verificar o fator de equilibrio de cada né; 3. Quando 0 fator de equilibrio de cada né for encontrado como 0 ou 1 ou -1, 0 algoritmo continuaré para a préxima operagao; 4, Quando 0 fator de equilibrio de qualquer né vem diferente dos trés valores acima, a arvore é considerada desequilibrada; 5. Em seguida, execute a rotagao adequada para tomé-lo equilibrado e, em seguida, 0 algoritmo ira prosseguir para a préxima operagao. » Etapas para a incluso 1. Em primeiro lugar, encontre 0 né onde k esté armazenado; 2. Em segundo lugar, exclia 0 contetido do né (suponha que o né seja x ); 3, Reivindicar: a exclusao de um né em uma drvore AVL pode ser reduzida com a exclusdo de uma folha. Existem trés casos possiveis: 3.1 Quando x nao tiver filhos, exclua x; 3.2 Quando x tem um filho, seja x' se torna filho de x; hitps:tstudent.ulfe.com.briContentPlayer/index?le=plU 7vIpJ7YXIVIY7GWOSZA%3d%38I=ySdEfpMurHaig47%2dbKHLNW'3d%3d8cd= 18150 21082022 23:17 Unidad 4 - Estutura da dados com orientagio a objetos -unidade 4 3.3 Aviso: x' no pode ter um filho, pois as subarvores de T podem diferir em altura em no maximo um: a. em seguida, substitua o contetido de x pelo contetido de x’; b. em seguida, exclua x" (uma folha): 4, Quando x tem dois filhos: 4.1 em seguida, encontre o sucessor z de x (que nao tem filho esquerdo); 4,2. em seguida, substitua o contetido de x pelo contetido de z ; 4.3 deletar z Em todos os trés casos, vocé acabaré removendo uma folha Observacdo : Em uma arvore bindria, 0 fator equilibrado ( Fe ) do né x é a diferenga de altura ( a ) entre a subarvore esquerda ( se) ¢ a di (se (x)) ( #PraCegoVer : F e de x igual a a vezes sd de x menos a vezes s e de x) (sd) de x, e pode ser representada pela formula: Fe (x) = a (sd (x)) - a Acompanhe a implementagéo em Java da incluséo de elementos em uma arvore AVL, mantendo o balanceamento: 1 Programa para incluso na arvore AVL 1 A implementago a seguir usa a inclusdo BST recursiva para inserir um novo né. Na inclusdo recursiva IIdo BST, apés a incluséo de um elemento, obtemos ponteiros para todos os ancestrais, um por um, de JImaneira ascendente. Portanto, ndo precisamos do ponteiro dos pais para subir. O proprio cédigo Iirecursivo viaja para cima e visita todos os ancestrais do né recém-inserido. class No { int chave, altura; No esquerdo, direito; No (int d) { chave = d; altura = } } class ArvoreAVL { No raiz; 1 Uma fungao de utilidade para obter a altura da arvore Int altura(No N) { if (N == null)retum O;return N.altura; } 1/ Uma fungao de utilidade para obter 0 maximo de dois inteiros int max (int a, int b) { return (a> b)? a: b; } 11 Uma fungao de utilidade para girar a direita a subarvore No diRotacao (No y) { No x= y.esquerdo; hitps:tstudent.ulfe.com.br/ContentPlayer/index?le=plU T¥pJ7YXIVIY7GWOSZA%:3d%348I=ySdETpMurHain47%2dDKHLNWIK3A%SdBcd=Su,.. 19/50 21082022 23:17 Unidad 4 - Estutura ge dados com orientagio a objetos -unidade 4 No 12 = xdireito; II Realiza a rotacéo xdireito = y; y.esquerdo = T2; 1 Atualiza alturas yaaltura = max (altura (y.esquerdo), altura (y.direito)) + 1; xaltura = max (altura (x.esquerdo), altura (x.direito)) + 1; I Retorna uma nova raiz return x; } 11 Uma fungao de utilidade para girar para a esquerda a subarvore No esqRotacao (No x) { No y = xdireito; No T2 = y.esquerdo; I Realiza a rotagao yesquerdo = x; xdireito = 72; 1 Atualiza alturas x.altura = max (altura (x.esquerdo), altura (x.direito)) + 1; y.altura = max (altura (y.esquerdo), altura (y.direito)) + 1; 1 Retorna uma nova raiz return y; } 11 Obter fator de equilibrio do né N int getEquilibrio (No N) { if ( ull) return 0; retum altura(N. esquerdo) - altura (N. direito); } No inserir(No no, int chave) { 1* 1, Realiza a inclusdo normal do BST */ if (no == null) return (new No(chave)); Iitps:sfstudent.ulfe.com.briContentPlayer/index?le=plU vIpJ7YXIVIY7GWOSZA%3d%348l-ySdETpMurHaigd7‘%2bbKHLNW'3q743d8cd=Su 20150 21082022 23:17 Unidad 4- Estutura a dados com orientagio a objetos -unidade 4 if (chave no.chave) no.direito = inserir(no.direito, chave); else // Chaves duplicadas nao permitidas return no; 1* 2, Atualiza altura deste né pai* / no.altura = 1 + max(altura (no.esquerdo), altura (no.direito)); 1* 3, Obtém 0 fator de equilibrio deste né pai para verificar se este né perdeu o equilibrio * / int equilibrio = getEquilibrio (no); 11 Se este né se tornar desequilibrado, ento so 4 casos 1Caso esquerda - esquerda if (equilibrio> 1 && chave no.direito.chave) return esqRotacao (no); 11 Caso esquerda- direita if (equilibrio> 1 && chave> no.esquerdo.chave) { no.esquerdo = esqRotacao (no.esquerdo); return dirRotacao (no); } 11 Caso direita-esquerda if (equilibrio <-1 && chave by? a: b; } 1/ Uma fungao de utilidade para girar a direita a subarvore No dirRotacao (No y) { No x= y.esquerdo; No T2 = xdireito; II Realiza a rotagao xdireito = y; y.esquerdo = T2; I Atualiza alturas yaltura = max (altura (y.esquerdo), altura(y.direito)) + 1; x.altura = max (altura (x.esquerdo), altura(x.direito)) + 1; I Retorna uma nova raiz return x; } // Uma fungao de utilidade para girar para a esquerda a subérvore No esqRotacao (No x) { No y = xi No T2 = y.esquerdo; II Realiza a rotacéo y.esquerdo = x; 1 Atualiza alturas xaltura = max (altura (x.esquerdo), altura(x direito)) + 1; yaaltura = max (altura (y.esquerdo), altura(y.direito)) + 1; 1! Retorna uma nova raiz return y; y Iitps:tfstudent.ulfe.com.briContentPlayer/index?le=plU TvpJ7YXIVIY7GWOSZA%3d%348l-ySdETpMurHaigd7*&2dbKHLNW'3d73d8cd=Su 23160 21082022 23:17 Unidad 4- Estutura a dados com orientagio a objetos -unidade 4 11 Obter fator de equilibrio do né N int getEquilibrio (No N) { if (N return 0; null) return altura(N. esquerdo) - altura (N.direito); } No inserir(No no, int chave) { 1* 1, Realiza a rotagao normal do BST */ if (no == null) return (new No(chave)); if (chave no.chave) no.direito = inserir(no.direito, chave); else // Chaves duplicadas nao permitidas return no; 1* 2, Atualiza altura deste né pai * / no.altura = 1 + max(altura (no.esquerdo), altura (no.direito)); 1 * 3. Obtém 0 fator de equilibrio deste né pai para verificar se este no perdeu o equilibrio int equilibrio = getEquilibrio (no); I Se este né se tomar desequilibrado, entao hé4 casos de rotagao a serem realizados HICaso esquerda - esquerdaif (equilibrio> 1 && chaveno.direito.chave) return esqRotacao (no); II Caso esquerda- direita if (equilibrio> 1 && chave>no.esquerdo.chave) { no.esquerdo = esqRotacao (no.esquerdo); return dirRotacao (no); } 11 Caso direita-esquerda if (eauilibrio <-1 && chave raiz.chave) raiz.direito = excluirNo (raiz.direito, chave); II se a chave é igual a chave da raiz, entdo este 6 0 né para ser excluido else { 11 né com apenas um descendente ou nenhum descendente if (raiz.esquerdo == null) || (raiz.direito ==null)) nulo; raiz.esauerdo) hitps:tfstudent.ulfe.com.briContentPlayer/index?le=plU vpJ7YXIVIY7GWOSZA%3d%&348l-ySdETpMurHaigd7&2bbKHLNW'3d73d8cd=Su 25150 21082022 23:17 Unidad 4 - Estutura ge dados com orientagio a objetos -unidade 4 temp = raiz.direito; else temp = raiz.esquerdo; 1 Caso sem descendentes if (temp { temp = raiz; null) raiz = null; } else // caso com 1 descendente raiz = temp; // utiliza 0 contetido do caso com descendentes } else { /I n6 com dois filhos: obtenha o percurso em ordem do sucessor IH ou seja, 0 menor na subérvore direita No temp = minValNo(raiz.direito); 1! Utilize os dados em ordem do sucessor para este né raiz.chave = temp.chave; IL Excluir 0 sucessor em ordem raiz.direito = excluirNo(raiz.direito, temp.chave); } } I Se a érvore tinha apenas um né, entéo retorna if (raiz null) return raiz; I PASSO 2: ATUALIZAR ALTURA DO NO ATUAL raiz.altura = max(altura (raiz.esquerdo), altura(raiz.direito)) + 1; I PASSO 3: OBTER O FATOR DE EQUILIBRIO DESTE NO(para verificar se Leste né ficou desequilibrado) int equilibri = getEquilibrio (raiz); II Se este né se tornar desequilibrado, entéo so 4 casos HICaso esquerda - esquerda if (equilibrio> 1 &8 chaveno direito.chave) Iitps:fstudent.ulife.com.br/ContentPlayer/index?le=plU 7vIpJ7YXIVIY7GWOSZA%3d%&348l-ySdETpMurHaigd7%&2dbKHLNW'3d73d8cd=Su, 26150 210812022 23:17 Unidad 4 - Estutura da dados com orientagio a objetos -unidade 4 return esqRotacao (no); II Caso esquerda- direita if (equilibrio> 1 && chave>no.esquerdo.chave) { no.esquerdo = esqRotacao (no.esquerdo); return dirRotacao (no); } 11 Caso direita-esquerda if (equilibrio <-1 && chave

You might also like