Baixe o app para aproveitar ainda mais
Prévia do material em texto
Balanceamento Estático de Árvores Binárias Estruturas de Dados Profa. Carla Koike Balanceamento de Árvores ● Eficiência da árvore como estrutura de busca depende da disposição de seus elementos! Pior caso: 6 testes!!!! Pior caso: 3 testes Árvore degenerada em lista! Árvore binária balanceada ● Subárvore da esquerda tenha aproximadamente a mesma altura da sub árvore da direita Árvore binária balanceada Altura Nós em um nível Nós em todos os níveis 1 1 1 2 2 3 3 4 7 4 8 15 11 1024 2047 14 8192 16383 h 2^(h1) 2^h 1 Número máximo de testes a serem feitos para busca!!! Algoritmos para Balanceamento de árvore ● Duas estratégias: – balanceamento estático ● usando vetor ● DSW – balanceamento dinâmico ou AVL Balanceamento Estático ● O balanceamento estático consiste em destruir a estrutura da árvore e reconstruíla balanceada ● Usando vetor: – Os dados da árvore são armazenados em um vetor (ou lista), ordenados e constróise outra árvore, balanceada, a partir desse vetor ● DSW: – Por meios de rotações, a árvore é transformada em uma árvore degenerada em lista (backbone) que é, por meio de rotações, transformada em uma outra árvore, dessa vez balanceada Balanceamento Estático usando vetor: gerando o vetor Vetor ordenado: ['B', 'D', 'K', 'M', 'P', 'R'] Balanceamento Estático usando vetor: gera árvore balanceada Vetor ordenado: ['B', 'D', 'K', 'M', 'P', 'R'] Elemento do meio do vetor passa a ser a raiz! Balanceamento Estático usando vetor: gera árvore balanceada Vetor ordenado: ['B', 'D', 'K', 'M', 'P', 'R'] Subvetor a esquerda passa a ser a subárvore da esquerda Balanceamento Estático usando vetor: gera árvore balanceada Vetor ordenado: ['B', 'D', 'K', 'M', 'P', 'R'] Subvetor a direita passa a ser a subárvore da direita Balanceamento Estático usando vetor void GeraVetor(struct tree *root, char v[] ){ static int i=0; if (root != NULL){ GeraVetor(root>Esq,v); i++; v[i]= root>info; GeraVetor(root>Dir,v); } } void DestroiArvore(struct tree *root){ if(root !=NULL){ DestroiArvore(root>Esq); DestroiArvore(root>Dir); free(root); } } void GeraArvore(int i, int j, char v[], struct tree *root) { int tmp; if( i > j) root = NULL; else{ tmp = (i+j)/2; Insere(v[tmp],root); GeraArvore(i,tmp1,root >Esq,v); GeraArvore(tmp+1,j,root >Dir,v); } } Balanceamento Estático DSW ● Inicialmente, a árvore é transformada em uma árvore degenerada em lista (backbone), por meio de rotações. Rotação a Direita Rotação a Esquerda Rotação ● Rotações alteram a estrutura da árvore binária – Especialmente, rotações podem ser utilizadas para alterar a altura de uma parte da árvore binária ● Rotações alteram a estrutura local de uma árvore binária – qualquer rotação afeta somente o nó rotacionado e seus filhos imediatos: os pais do nó rotacionado e os filhos de seus filhos permanecem inalterados ● Rotações não alteram o ordenamento dentro da árvore binária – O mesmo tipo de busca pode ser feito na árvore, antes e depois de uma rotação Rotacionando Nó Filho a direita Avô Pai Filho NetoL NetoR Rotacionando Nó Filho a direita Avô Pai Filho NetoL NetoR Se avô não nulo torna Avô o ascendente direto do filho Rotacionando Nó Filho a direita Avô Pai Filho NetoL NetoR Se avô não nulo torna Avô o ascendente direto do filho a subárvore do neto direita torna se a subárvore esquerda do pai Rotacionando Nó Filho a direita Avô Pai Filho NetoL NetoR Se avô não nulo torna Avô o ascendente direto do filho a subárvore do neto direita torna se a subárvore esquerda do pai pai tornase sub árvore direita do filho Rotacionando Nó Filho a direita Avô Pai Filho NetoL NetoR Avô Pai Filho NetoL NetoR Criando backbone de árvore rotacionando a direita B tem filho a esquerda? Não K tem filho a esquerda? Sim, D Rotaciona D a direita Criando backbone de árvore rotacionando a direita B tem filho a esquerda? Não K tem filho a esquerda? Sim, D Rotaciona D a direita P tem filho a esquerda? Sim, M Rotaciona M a direita B D K P RM Criando backbone de árvore rotacionando a direita B D K P R M B tem filho a esquerda? Não K tem filho a esquerda? Sim, D Rotaciona D a direita P tem filho a esquerda? Sim, M Rotaciona M a direita R tem filho a direita? Não Balanceamento Estático DSW ● Inicialmente, a árvore é transformada em uma árvore degenerada em lista (backbone), por meio de rotações. – O(n), pior caso (Qual?) ● A árvore degenerada em lista é transformada em outra árvore, desta vez balanceada Criando árvore balanceada do backbone Criando árvore balanceada do backbone Criando árvore balanceada do backbone Criando árvore balanceada do backbone ● Se backbone a esquerda, são realizadas rotações a direita em nós alternados ● Se backbone a direita são realizadas rotações a esquerda em nós alternados B D K P R M U Criando árvore balanceada do backbone ● Árvore balanceada completa teria altura k e 2k 1 nós em todos os níveis ● Para um backbone com exatos 2k 1 nós, a cada laço, são executadas rotações em nós alternados. ● Se o backbone possui um valor m de nós tal que 2k 1 < m < 2k+1 1, então – executase inicialmente x rotações, onde x = m (2k 1) – e então continua como se um backbone de 2k 1 nós Criando árvore balanceada do backbone ● Árvore com 9 nós: dois a mais que os 7 necessários para uma árvore balanceada de altura 3 ● Realiza duas rotações inicialmente, e depois realiza rotações alternadas a partir da raiz
Compartilhar