prof. jesus josé de oliveira netoprofessor.pucgoias.edu.br/.../aula_arvores_red_black.pdf ·...

Download Prof. Jesus José de Oliveira Netoprofessor.pucgoias.edu.br/.../Aula_Arvores_Red_Black.pdf · 2016-11-30 · Aula_Arvores_Red_Black Author: Usuario Created Date: 11/30/2016 8:36:21

If you can't read please download the document

Upload: others

Post on 14-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

  • Prof. Jesus José de Oliveira Neto

  • � As árvores Vermelho-preto são árvores binárias de busca

    � Também conhecidas como Rubro-negras ou Red-Black Trees

    � Foram inventadas por Bayer sob o nome “Árvores Binárias Simétricas”

  • 3

    � As árvores vermelho-preto possuem um campo extra para armazenar a cor de cada nó, que pode ser VERMELHO ou PRETO

    � Além deste, cada nó será composto ainda pelos seguintes campos:◦ valor (os “dados” do nó)◦ esquerda (filho esquerdo)◦ direita (filho direito)◦ pai

  • � Árvore vermelho-preta é complexa, mas é bastante eficiente na prática

    � De maneira simplificada, uma árvore vermelho-preta é uma árvore de busca binária que insere e remove de forma inteligente,

    � Para assegurar que a árvore permaneça mais balanceada possível

  • � 1. Todo nó é vermelho ou preto

    � 2. A raiz é preta

    � 3. Toda folha (Nil) é preta

    � 4. Se um nó é vermelho, então os seus filhos são pretos

    � 5. Para cada nó, todos os caminhos do nó para folhas descendentes contém o mesmo número de nós PRETOS (Altura negra).

  • � Um nó que satisfaz os itens acima é denominado equilibrado, caso contrário é dito desequilibrado

    � Em uma árvore vermelho-preta todos os nós estão equilibrados

    � Uma condição óbvia obtida das propriedades é que num caminho da raiz até uma subárvorevazia não podem existir dois nós vermelhos consecutivos

  • � Percebe-se que uma árvore vermelho-preta é uma árvore binária de busca, com algumas propriedades adicionais.

    � Considera-se também que quando um nó não possui um filho (esquerdo ou direito) então vamos supor que ao invés de apontar para nulo

    � O mesmo aponta para um nó fictício chamado Nil, que será uma folha da árvore.

    � Assim, todos os nós internos contêm chaves e todas as folhas são nós fictícios.

  • � Cada vez que uma operação for realizada na árvore, o conjunto de propriedades é testado

    � Caso alguma não seja satisfeita, são realizadas rotações e/ou ajustes de cores, de forma que a árvore permaneça balanceada

  • � Exemplo de uma árvore vermelho-preta com nós nulos (nil)

  • � Exemplo de uma árvore vermelho-preta sem nós nulos (nil)

  • � As operações Inserir e Remover são mais complicadas nas Árvores vermelho-pretas pois as suas propriedades podem ser violadas.

    � Essas operações podem ser implementadas de forma bastante parecida com as respectivas operações nas Árvores Binárias de Busca, bastando apenas modificar as cores dos nós para que as propriedades de Árvores vermelho-pretas sejam satisfeitas.

    � Como a inserção e a remoção propriamente ditas já foram vistas para Árvores Binárias de Busca, veremos apenas o que é necessário para ajustar as cores da árvore.

  • � Um nó é inserido sempre na cor vermelha, assim, não altera a altura da árvore

    � Se o nó fosse inserido na cor preta, invalidaria a propriedade 5, pois haveria um nó preto a mais em um dos caminhos

  • � A operação de inserção em uma árvore vermelho-preta começa por uma busca da posição onde o novo nó deve ser inserido, partindo-se da raiz em direção aos nós que possuam o valor mais próximo do qual vai ser inserido

    � Se esta inserção for feita em uma árvore vazia, basta alterar a cor do nó para preto, satisfazendo assim a propriedade 2

    � Se a árvore já estiver preenchida existem três casos a serem considerados

  • � Caso 1: Ao inserir x, se o tio de x é vermelho, e o pai também, é necessário fazer a recoloração de a, t e p

    � Obs1: Se o pai de a é vermelho, o rebalanceamento tem que ser feito novamente

    � Obs2: Se a é raiz, então o mesmo deve ser preto!

  • � Nos casos 2 e 3, onde o tio de x é preto, deverão ser feitas alterações na estrutura da árvore vermelho-preta para manter as suas propriedades.

    � Estas alterações são chamadas de rotações que podem ser de dois tipos:◦ Rotação para a esquerda ◦ Rotação para a direita

  • � Rotação esquerda=>

    � Rotação direita

  • � O algoritmo de inserção não viola as propriedades de árvore vermelho-preta.

    � O algoritmo de inserção substitui um nó sentinela (preto) por um novo nó interno vermelho z contendo o valor novo inserido. Este nó aponta, por sua vez, a dois nós sentinela (preto), à esquerda e à direita.

    � Após a inserção, mas antes de executar correção na árvore, apenas as propriedades 2 e 4 podem estar violadas: ◦ a propriedade 2 é violada se z é a raiz e a propriedade 4

    é violada se o pai de z é vermelho. A árvore vermelho-preta deve corrigir essa eventual violação.

  • � Reiterando, existem três casos a considerar quando z e pai[z] são vermelhos. Existe pai[pai[z]] pois pai[z] sendo vermelho não pode ser a raiz.◦ Caso 1: z tem um tio y vermelho.◦ Caso 2: z tem um tio y preto e z é filho direito.◦ Caso 3: z tem um tio y preto e z é filho esquerdo.

    � No caso 1, mudamos algumas cores e subimos z para ser pai[pai[z]] e assim sucessivamente, podendo chegar até a raiz.

    � No caso 2 e 3 mudamos algumas cores e fazemos uma ou duas rotações.

  • � Iremos colorir o pai[z] e tio y pretos e pai[pai[z]] vermelho que passa a ser o novo z

  • � Executaremos uma rotação para a esquerda no 2, sendo o novo z, e transformando para caso 3

  • � Iremos colorir pai[z] preto e pai[pai[z]] vermelho e executamos rotação a direita no pai[pai[z]]

  • � Remoção numa árvore vermelho-preta ocorre da mesma forma que uma árvore binária de busca

    � No entanto, ao final da remoção verifica-se se nenhuma de suas propriedades foi violada◦ Se o nó removido é preto

    � Caso ocorra uma violação de alguma propriedade, a mesma deve ser restaurada

  • � Existem quatro possíveis casos de remoção numa árvore vermelho-preta:◦ Caso 1: o irmão do nó removido é vermelho◦ Caso 2: o irmão do nó removido é preto e os filhos

    de seu irmão são pretos◦ Caso 3: o irmão do nó removido é preto, o filho da

    esquerda de seu irmão é vermelho e o da direita é preto◦ Caso 4: o irmão do nó removido é preto, o filho da

    direita de seu irmão é vermelho

  • � Se irmão é vermelho (por definição os filhos serão pretos), troca as cores de pai com irmão e rotacionaa esquerda sobre o pai (CASO INVERSO TAMBÉM EXISTE). Refaz o balanceamento considerando o nó atual.

  • � Se irmão e sobrinhos são pretos (lembrando que nós folha (nulos) são nós pretos), pinta o irmão de vermelho. Árvore pode estar desbalanceada para cima. Então refaz o balanceamento considerando o nó PAI.

  • � Se irmão é preto, o sobrinho (próximo) a esquerda é vermelho e sobrinho (distante) a direita é preto, troca as cores do irmão com o sobrinho (próximo) a esquerda e rotaciona a direita no nó IRMÃO (caso inverso existe). Refaz o balanceamento sobre o mesmo nó atual.

  • � Se irmão é preto e o sobrinho (distante) a direita é vermelho, copia a cor do pai para o irmão, pinta o pai e o sobrinho (distante) a direita de preto e rotaciona a esquerda sobre o PAI (caso inverso existe). Termina a rotina de balanceamento, verificando a cor do nó RAIZ.

  • � Lembrando:◦ Essa rotina é executada enquanto o nó sendo

    removido não é o nó raiz e é um nó diferente de vermelho

    � • Observação:◦ Ao final da rotina de balanceamento, caso o nó seja

    vermelho (o quê acarreta no fim da rotina), pinta-se o nó de preto

    � Essa sequência de rotinas (casos 1 a 4) pode ser visualizada no algoritmo abaixo