Você está na página 1de 367

Universidade Federal de Itajub

Mestrado em Cincias e Tecnologia da Informao


Prof. Dr. Alexandre C. B. Ramos
ramos@unifei.edu.br
www.ici.unifei.edu.br/ramos

Algoritmos e Estruturas de Dados

Objetivos
Mapear o domnio do problema no domnio da soluo
utilizando estruturas de armazenamento de
informaes adequadas e algortimos eficientes.
Construir estruturas a partir de abstraes tanto de
informaes quanto do procedimentos.
Construir e analisar algortimos para manipular e
armazenar dados em programas.
Critrio de avaliao:
70% - Prova bimestral
30% - Trabalhos

Programa 1. bimestre
Introduo
Tipos abstratos de dados
Registros
Procedimentos e funes
Recursividade
Complexidade de algoritmos
Introduo
Tipos de complexidade
Notao O
Algoritmos timos
Programa 1. bimestre
Listas, filas e pilhas
Alocao sequencial
Listas encadeadas
Listas circulares
Listas duplamente encadeadas
Filas e pilhas
rvores
Percurso em rvores
rvores AVL
rvores rubro-negras
rvores mltiplas

Bibliografia
Tenenbaum, A. M. et all. Estruturas de Dados Usando
C. Makron Books. So Paulo, 1995.
Estruturas de dados. Paulo Veloso, Clsio Veloso dos
Santos e outros. Ed. Campus.
Algortmos e Estruturas de dados. Guimares Lages.
Ed. LTC.
Estruturas de dados Fundamentais: conceitos e
aplicaes. Silvio do Lago. Ed. rica


Avaliaes
Trabalhos prticos individuais = 10pts
Seminrios em grupo = 20pts
Avaliao escrita = 70 pts (26/09/2012)

Seminrios
Apresentao e exerccios com correo.
Temas e datas:
rvores AVL : Diogenes, Ricardo e Wellison : 12/09
rvores Rubro-negras : Daniele e Henrique : 12/09
rvores B e B* : Iuri, Orlando e Rodrigo : 19/09
rvores de Bit : Joo e Danillo : 19/09
rvores R : Felipe e Flvio : 19/09

Avaliao: 26/09


Introduo
Desenvolvimento de Programas
O processo de soluo de problemas por meio de computador
pode ser descrito a partir das seguintes etapas:
1. Especificao do problema
2. Projeto em alto nvel
3. Anlise de alternativas
4. Refinamento e codificao
5. Verificao do comportamento
Desenvolvimento de Programas
Nesta descrio devemos ressaltar 3 pontos:
Estruturas de dados, que retratam as relaes lgicas
existentes entre os dados, de modo anlogo ao uso de um
modelo matemtico para espelhar alguns aspectos de uma
realidade fsica.
Operaes, manipulam as estruturas de dados
transformando-as.
Estruturas de Representao, que so formas de
armazenar na memria os dados, isto , as estruturas de
dados manipuladas pelas operaes, que devem:
Preservar as relaes lgicas existentes entre os dados.
Permitir que as operaes sejam descritas por
procedimentos simples e eficientes.

Exerccio 1
Escreva um algoritmo para solucionar o seguinte problema:
Trs missionrios e trs canibais se encontram em um lado
do rio. Todos concordam que precisam chegar do outro
lado.
Mas os missionrios no confiam nos canibais. Assim, os
missionrios querem atravessar o rio de modo tal que o
nmero de missionrios em qualquer das margens
nunca seja inferior ao nmero de canibais que estiver do
mesmo lado.
O nico barco disponvel s carrega 2 pessoas por vez.
Como todos podero chegar ao outro lado, sem que os
missionrios arrisquem suas vidas?
Exerccio 1bis
Escreva um programa em linguagem C que, de forma
interativa, ajude o usurio a resolver o problema.
O programa dever ser apresentado na tela de texto, sendo
os canibais representados pela letra C e os missionarios
pela letra M.
O usurio dever escolher o conjunto certo de C e M
para atravessar o rio para o lado desejado.
A aparencia do programa podera ser:


CC MMM C

Vai: C C Volta:
Tipos Abstratos de Dados
Tipos Abstratos de Dados
Para descrever os algortimos e procedimentos durante o curso,
vamos utilizar uma linguagem de descrio algoritmica.
A noo do tipo de dados ocorre na maioria das linguagens de
programao. O tipo da varivel delimita o conjunto de
valores que ela pode tomar e as operaes que podemos
efetuar com elas.
Geralmente uma linguagem de programao oferece 2 tipos de
Tipos de dados:
Tipos Primitivos: So tipos bsicos pr definidos
Tipos construdos: tipos criados a partir de mecanismos
presentes na linguagem.


Tipos primitivos Operaes aceitas
inteiro - int + - * div mod
real - real + - * /
lgico - log e ou no (.e. & .ou. V )
caracter- car = =

Exemplos: Tipos inteiro ? Real ? Lgico ? Caracter ?


5 div 2 = 2
5 mod 2 = 1
5 2
1 2
V= F e F = V
Funes de Transferncia
So operaes especiais que manipulam variveis de tipos
primitivos, diferentes entre si, por exemplo: X
i
sendo X real e
inteiro.
Comparaes tambm podem ser consideradas funes de
transferncia, por exemplo:X < i sendo X real e i inteiro e o
resultado lgico F(V)
Trunc, converte um numero real em inteiro trunc (75.37)=75
Tier, converte inteiro em real tier (75)= 75.0
Ord, transforma car em int que seu numero de ordem no
conjunto de caracteres ASCII ord (0) <...< ord (9)<...<
ord(A)<...< ord(a). Mais funes de transferencia podem
ser obtidas nos tipos construdos.
Utilizados para construir tipos novos a partir de tipos
primitivos, segundo a definio:
Tipos nome_do_tipo: definio_do_tipo
a ser utilizada com os seguintes mecanismos:
Tipos construdos forma Geral
Vetor - Vet Vet (limite inferior...limite superior) de tipo

registro - reg reg (seletor1: tipo1, seletor2: tipo2,...,seletorn: tipon)

seqncia- seq seq de tipo p/ ex: tipo cadeia:: seq car

referncia - ref ref a tipo p/ ex: tipo matricula:: ref int

alternativa - alt alt (tipo1 | tipo2 |...| tipon ) p/ ex: tipo questo:: alt (int |
car)


string
ponteiro
Mecanismo para construo de tipos
Exemplos:
Vetor= tipo dia :: vet [0...30] de int [1,2,3,4,...31]
onde dia[2] = 3 dia [i] = 31 ento i= 30
Registro= tipo inscrio::reg (disciplina: int, turma: car)
Se matricula: inscrio Se matricula uma varivel do tipo
inscrio, ento matricula (103, a)
da temos: matricula.turma= a
matricula.disciplina= 103
O elemento da
turmaa, quer
inscrever-se na
disciplina 103


Seqncia= tipo cadeia:: seq car
Se x: cadeia e x< r, a, m> Seq. De comprimento 3
y: cadeia e y<e, m, i, g, r, a> Seq. De comprimento 6
Ento princ x = r
cont x = < a, m>
yconc x = < e, m, i, g, r, a, r, a, m>
Se Z: cadeia e Z< a > Ento princ Z=a cont z=<>


Seqncia nula de
comprimento 0
Referncia
Tipo de matricula :: ref int
Este mecanismo permite uma modalidade dinmica de
alocao, ao contrrio dos mecanismos anteriores
(vet, seq, etc.) cuja alocao contnua.
Se geografia: matrcula o espao necessrio para a
varivel geografia compreende 2 partes:
1 parte do valor: armazena um valor do tipo int;
2 parte de posio: armazena uma indicao de
posio da localizao da parte de valor.





Aloque geografia
a) aps a declarao da varivel

b)aps a execuo do comando aloque



Desaloque geografia
c)aps a execuo do comando
(Na memria)
Parte de posio (geografia)
Parte de posio
Parte de valor geografia
Parte de posio
Sejam os comandos:


Alternativa= tipo questo:: alt ( int | car )
Se resposta : questo
Ento resposta? tem valor igual a 1 (int) ou 2 (car)

Enumerao
Permite definir tipos de dados por meio dos valores que os
dados daquele tipo podem tomar.
Tipo ms=
(jan,fev,mar,abr,mai,jun,jul,ago,set,out,nov,dez)
seja ms_nasc: ms
Se ms_nasc= dez Ento Processo qualquer
Permite que uma mesma varivel possa, em
momentos diferentes, ter valores e tipos diferentes
jan<fev<mar<...<dez
Variveis, Declaraes e Expresses
Nomes (identificadores) podem ser usados para denotar
variveis, do seguinte modo:
var nome: tipo; ou nome1, nome2,...,nome3: tipo;
Todas as variveis existentes no programa fonte devem
ser declaradas uma vez ( e somente uma vez) no seu
cabealho, exemplos:
Tipos Variveis
matr10:: vet [0..9] de vet [0..9] de real; adj, custo: matr10;
status:: reg (no: int, ferias: log, dia: int); folha: seq de status;
nome:: seq car; alfa: vet [1970...1975] de nome;
celula:: ref int; onde : celula

Exerccio 2
Escreva um algoritmo que leiam duas strings de 0s e
1s representando inteiros no-negativos binrios, e
imprima a string representando a soma, a diferena e
o produto, respectivamente.
Comandos Bsicos
Comandos Bsicos
So utilizados para manipular as variveis, so eles:
Atribuio varivel expresso
Entrada Leia ( lista_de_variveis)
Sada Escreva ( lista_de_variveis) Se condio ento comando
Condicionais Se condio ento comando seno comando
Interao Enquanto condio faa comando Repita comando
at
(que) condio para varivel de valor_inicial incr
valor_do_incremento at valor_inicial.
Faa comando
Escape de malha Sada ou escape
Seleo Conforme varivel, Faa lista_dos_casos
Atribuio
V e (e precisa ser do mesmo tipo de V)
X (Y+Z)/2.0 x,y e z: real;
O valor de X depois da avaliao ser mdia
aritmtica dos valores de Y e Z antes
i i+1 exemplo comum para contagens
Variveis de tipo contrudo:
var custo: vet[1..5] de real;
custo[1] custo[2] + 7.8
var matr: reg(disc: int, turma: car);
matr (2015, a );
Exemplos:

Entrada de Dados
Leia (V1, V2, V3, ... , Vn);
Neste caso todas as variveis listadas recebem
vetores do dispositivo de entrada. Por exemplo:
var
x: real; i: int; a: vet [1..3] de int;
Incio
leia (x,a,i)
Fim.
Causar a leitura do dispositivo de entrada para x, a e
i de um real, um vetor e um inteiro.
Exemplos:
Sada de Dados
Escreva (V1, V2, V3, ...Vn);
Neste caso todas as variveis listadas sero escritas
no dispositivo de sada, por exemplo:
var
i: int;
a: vet [1..5] de int;
x: real;
Incio
x 2.1; i i+ 2; a[2] i;
escreva(i,a,x);
Fim.
Exemplos:

Condicional
Se L Ento A Seno B
var x,y,z: real; {Calcula o menor de 2 nos.}
Se x < y Ento z x {comando simples}
Seno Incio {comando composto}
z y;
Se x < z Ento z x;
Fim;
A avaliao da condio no altera o valor de
nenhuma varivel mesmo que ela contenha
expresses como:
Se (2.0*y < x/3.2) .e. (z<>0) Ento...
Exemplos:
Iterao - Enquanto
Enquanto L Faa A
Var x, y: int;
Incio
Enquanto x =< y Faa x 2*y;
Enquanto x <> y Faa
Se x > y Ento x x - y
Seno y Y - x;
Fim.
Causa a repetio do comando at que x=y. Caso o
sejam no incio o programa termina aps o primeiro
teste.
Iterao - Repita
Repita A at L
Var x,y: int;
Incio
Se x >< y Ento
Repita
Se x > y Ento x x-y
Seno y y-x;
At x=y;
Fim.
Iterao - Para
Para V de i incr P at F Faa A
Var i, soma: int;
valor: vet [1..10] de int;
Incio
Soma 0.0;
Para i 1 at 10 Faa
soma soma+valor[i];
Fim.
Seleo
Caso V Faa (V1:C1, V2:C2,...,Vn:Cn) ou
Caso V Faa (V1:C1, V2:C2,...,Vn:Cn)
Seno Faa (V1:C2, V2:C3,...,Vn:Cn+1)
Onde Vi so valores e Ci so comandos, exemplo:
Var Ch: car;
Incio
Caso Ch Faa
A..Z,a..z: Escreva (Letra);
0..9: Escreva(Digito);
+,-,*,/: Escreva (Operador);
Seno Escreva (Caracter especial);
Fim;
Fim.

Exerccio 3
Escreva um algoritmo para ler uma string de 0s e 1s
representando um inteiro positivo em notao binria
e imprima uma string de 0s, 1s e 2s representando o
mesmo nmero em notao ternria
Escreva um programa em C que realize essa
converso
Variveis Indexadas - Vetores
A utilizao de vetores em
computao uma tcnica
muito til para a otimizao
de tempo e memria e torna
um programa mais elaborado
e eficiente.
Forma geral:
Tipo vetor:: vet[1..3] de int;
Var A, B, C: vetorz;

Leitura e Escrita de um Vetor
Exemplo: Leitura
Var x: vet[1..4] de int;
Incio
Para i:= 1 at 4 Faa leia(x[i]);
Fim.
Exemplo: Escrita
Var x: vet[1..4] de int;
Incio
Para i:=1 at 4 Faa Escreva(x[i]);
Fim.
bom lembrar que poderamos usar os comandos
Repita e Enquanto, tanto na leitura quanto na escrita.
Variveis Indexadas - Matrizes
Uma matriz uma varivel
indexada que possui 2 dimenses
e portanto precisa de 2 ndices
para marcao de valor. Sua
representao matemtica :
dimenso: m - linhas representao: Amxn
n - colunas
Forma geral:
Tipo matriz:: vetor[1..3,1..3] de int;
Var A, B, C: matriz;

Leitura e Escrita de uma Matriz
Faz-se necessrio 2 varreduras,
uma com a varivel j percorrendo
as colunas e outra com a varivel
i percorrendo as linhas:
Exemplo: Leitura
Para i:= 1 at m Faa
Para j:= 1 at n Faa Leia(A[i,j]);
Exemplo: Escrita
Para i:= 1 at m Faa
Para j:= 1 at n Faa Escreva(A[i,j]);



Exemplo
Fazer um algoritmo Algoritmo Matriz;
para ler e imprimir Var A: vet[1..3,1..3] de int; i,j: int;
a matriz: Inicio
Para i:= 1 ate 3 Faa
Para j:= 1 ate 3 Faa Leia(A[i,j]);
Para i:= 1 ate 3 Faa
Para j:= 1 ate 3 Faa Leia(A[i,j]);
Fim.
Registros
So conjuntos de dados logicamente relacionados,
mas de tipos diferentes (inteiro, real, car etc.);
Utilizamos registros, quando vetores ou matrizes
possuem diferentes componentes dentro de um
mesmo campo, por exemplo:
Como criar uma matriz
desse tipo, onde existem
2 tipos de variveis (int
e car)? Percebe-se que
impossvel a utilizao
de matrizes, pois na mesma declarao s pode conter
um tipo de elemento. Por isso utiliza-se reg.

Forma Geral de Registro
Tipo
pagantes:: reg (cadast: int,
nome: caract,
bandeira: caract,
pagamento: caract);
Pode-se utilizar vetor composto por reg ou matriz
composta por reg, exemplo:
Escreva um algoritmo que dados 10 codigos de
profisso, emita o nome da profisso correspondente.
Algoritmo Profissao;
Tipo lista: reg(codigo: int,
nome:caract);
Var tab: vet [1..100] de lista;
cod,i,k: int;
Inicio
Para i:= 1 ate 10 Faa leia(tab[i].codigo, tab[i].nome);
Leia (cod); {recebe o codigo para comparar}
Repita
i:= 1;
Enquanto(tab[i].cod<>cod) e (i=<10) Faa i:=i+1;
Se (i>10) Ento Escreva(Codigo invalido)
Seno Escreva(Cod. Desejado ,tab[i].nome);
Ate(cod=0);
Fim.
Arquivos
So estruturas de dados manipuladas fora do
ambiente do programa. Considera-se como ambiente
do programa a memria principal, onde nem sempre
possvel ou conveniente manter certas estruturas de
dados.
No ambiente do programa, tem de ser declaradas as
estruturas externas de dados: declara-se primeiro o
tipo do arquivo e depois os nomes dos arquivos deste
tipo. Um exemplo: Algoritmo arquivo;
Var dados: text;
Incio
Fim.
Abertura e Fechamento de um Arquivo
Para abrir um arquivo novo, utiliza-se o comando:
Rewrite (NomeArquivo);
Este comando ignora os dados existentes e imprime os
novos dados no lugar dos antigos.
Para a associao desta identificao interna com o
nome externo do arquivo usa-se o comando:
Assign (NomeArquivo, NomeExtern);
Para abrir um arquivo cujo problema no perder os
dados existentes:
Reset(NomeArquivo);
Assim, os dados no so perdidos e a impresso
realizada depois da ltima linha de dados.
Associao de Arquivos no Programa
Para a associao, tambm utiliza-se o comando:
Assign(dados,dados.txt);
Exemplo:
Algortimo Arquivo;
var
dados:text;
Inicio
Assign(dados,dados.txt);
Reset(dados);
Fim.


Fechamento de Arquivo
Para terminar a gerao do arquivo, faz-se necessrio
o comando de fechamento antes do End. final do
programa, forma geral:
close(NomeArquivo);
exemplo:
........
close(dados);
Fim.
Escrevendo e Lendo de Arquivos
Toda vez que no for desejado ler da tela, ou imprimir
na tela, uma pequena modificao deve ser feita nos
comandos Escreva e Leia, por exemplo:
Leia (dados, x, y); Escreva (dados, x,y);
Assim a estrutura completa fica:
var dados: text; x,y: int;
Inicio
Assign(dados,dados.txt);
Reset(dados);
leia(dados,x,y); ........ Escreva(dados,x,y);.......
Close(dados);
Fim.

Exercicio 4
Desenvolver um algoritmo que leia os valores de duas
matrizes mxn quaisquer e A e B, do arquivo
entrada.dat e escreva os valores da matriz C=A+B no
arquivo saida.dat. Escreva um programa que realize
este algoritmo.
Procedimentos
So trechos de programa que possuem seus objetos
(variveis, arquivos etc.) e comandos prprios e que
para serem executados devem ser ativados por um
programa principal ou outro procedimento:
Forma Geral:
Procedimento nome;
declarao dos objetos locais ao procedimento
Inicio
comandos do procedimento
Fim;
Exemplo de Procedimento
Algoritmo proced;
var A,B,C,X,Y,Z: int; teste:log;
Procedimento Repete;
Inicio
x SQR(A)+B*SQR(B)+SQR(C)*SQR(C);
y A+C;
Fim;
Inicio
Teste false; Leia (A,B,C);
Repete;
Se x>y Entao teste true; A A+1; Leia(z); Repete;
Escreva(x,y,z,teste);
Fim.

Funes
Usada para atribuir o resultado da chamada de um
procedimento a uma varivel.
Forma Geral:
Funo nome: tipo;
declarao dos objetos locais a funo;
Inicio
comandos da funo;
Fim;
Exemplo de Funo
Algoritmo funcao;
var A, B, C: real;
Inicio
Funcao ABS(x): real;
Var x: real;
Inicio
Se x>= 0 Entao ABS X Senao ABS -X;
Fim;
A 5; B -3; C -10; Escreva (ABS(A));
Escreva (ABS(-3)); E ABS(E**3) * A+B; Escreva (E);
Fim.
Ponteiros
So utilizados para alocao dinmica de variveis.
Alocao dinmica: o programa capaz de alocar rea
de memria, que no foram declaradas
anteriormente;
Para alocar uma varivel dinamicamente, deve-se:
1. Criar espaos para as novas variveis em tempo de
execuo; e
2. Definir ligaes entre essas variveis
dinamicamente.
A gerao de uma varivel dinmica de tipo qualquer
feita pelo operador NEW.
Exemplo de Ponteiro
New(p); {Gera uma varivel de tipo qualquer e a}
{coloca em P o endereo da varivel }
Program Aloca;
P Type ptr= integer;
Var P:^ptr; {estatica}
Memria usada Memria Livre Begin
pelo programa do sistema New(P); {dinamica}
P $5C2D p^:= 1234;
$5C2D 1234 writeln(p^);
End.

Exemplo de Ponteiro em Pascal
Exerccio 5
Escrever um algoritmo que leia uma tabela contendo
registros de matriculas, nomes e notas (B1, B2 e MF)
e permita ao usurio as funes inserir, excluir,
alterar e pesquisar registros pelo numero da
matricula. Escreva um programa que realize este
algoritmo.
Recursividade
Recursividade
Chama-se mtodo recursivo um mtodo que, para ser aplicado a
uma estrutura, envolve a aplicao dele mesmo s subestruturas
componentes.
Todo procedimento recursivo (ou no) deve possuir pelo menos
uma chamada proveniente de um local exterior a ele (chamada
externa).
Em termos de programao, isso implica em procedimentos que
chamam a si prprios, exemplo:
Proc fat : int (n:int) Suponha k <- fat(5)
Se n=0 como n <> 0
Ento 5*fat(4)
retorne 1 4*fat(3).....
Seno 1*fat(0)
retorne n * fat (n 1) como n=0 a recursividade
para e o resultado calculado
Recursividade
A todo procedimento recursivo corresponde um outro
no recursivo que executa, exatamente, a mesma
computao, por exemplo:
Fa[0] = 1
Para j = 1,...,n faa
fat[j] = j x fat[j-1]
Exerccio 6
1. Imagine A como um vetor de inteiros. Apresente
algoritmos recursivos para calcular:
O elemento mximo do vetor
O elemento mnimo do vetor
A soma dos elementos do vetor
O produto dos elementos do vetor
A mdia dos elementos do vetor
2. Determine o que a seguinte funo calcula:
Func(n)
int n; {
if (n==0) return (0);
return (n+func(n-1);
}

Exerccio 6
3. Responder certo ou errado:
Todo procedimento recursivo deve incorporar terminaes sem
chamadas recursivas, caso contrrio ele seria executado um
nmero infinito de vezes.
O algoritmo que calcula o fatorial de forma recursiva, requer
apenas uma quantidade constante de memria
O algoritmo fatorial no recursivo, requer o armazenamento do
vetor fat, com n+1 elementos
4. Mostrar que o algoritmo para o problema da torre de Hanoi,
requer exatamente 2
n
1 movimentos de disco para terminar.
5. Elaborar um programa no recursivo para a torre de Hanoi.
Complexidade de Algoritmos
Complexidade de Algoritmos
A Complexidade de um Algoritmo consiste na
quantidade de trabalho necessria para a sua
execuo.
A expresso matemtica que define a complexidade de
um algoritmo determinada pela contagem de uma
grandeza (por exemplo, as operaes dominantes
realizadas).
Operao dominante o conjunto de operaes bsicas
que so executadas repetidas vezes.
Complexidade de Algoritmos
Um algoritmo serve para resolver um determinado
problema, e todos os problemas tm sempre uma entrada
de dados (N)
O tamanho desse N afeta sempre diretamente no tempo de
resposta de um algoritmo
Dependendo do problema, j existem alguns algoritmos
prontos, ou que podem ser adaptados
O problema : qual algoritmo escolher?

Complexidade de Algoritmos
A complexidade de um algoritmo pode ser dividida
em:
Complexidade Espacial: Quantidade de recursos
utilizados para resolver o problema;
Complexidade Temporal: Quantidade de Tempo
utilizado. Pode ser visto tambm como o nmero
de instrues necessrias para resolver
determinado problema;
Em ambos os casos, a complexidade medida de
acordo com o tamanho dos dados de entrada (N)

Complexidade de Algoritmos
Exemplo 1: inverso de uma sequncia
Para i = 1,...,[n/2] faa
temp = S[i]
S[i] = S[n-i+1]
S[n-i+1] = temp

Nesse algoritmo cada entrada uma sequencia que se deseja
inverter e o algoritmo efetua sempre as mesmas operaes para as
sequencias de mesmo tamanho n.
Cada passo executa uma troca de posies, ento o nmero de
passos igual ao numero de execues do bloco Para, ou seja,
[n/2] sendo n>1.
Complexidade de Algoritmos
Exemplo 2: Soma de matrizes
para i = 1,...,n faa
para j = 1,...,n faa
cij = aij + bij
Qual o numero total de passos?

Como no exemplo o algoritmo sempre efetua as mesmas
operaes sempre que a e b forem matrizes nxn e n o
parmetro independente.
Cada passo desse algoritmo corresponde a execuo da
soma aij + bij e o nmero total de passos igual ao
nmero total de somas, isto , o algoritmo efetua n
2

passos.
Complexidade de Algoritmos
Exemplo 3: Multiplicao de matrizes
para i = 1,...,n faa
para j = 1,...,n faa
cij = 0
para k = 1,...,n faa
cij = cij + aik * bkj
Qual o numero total de passos?


Como no exemplo o algoritmo sempre efetua as mesmas
operaes sempre que A e b forem matrizes nxn e n o
parmetro independente.
Cada passo desse algoritmo corresponde a execuo do produto
aik * bkj e o nmero total de passos igual ao nmero total de
somas, isto , o algoritmo efetua n
3
passos.
Complexidade de Algoritmos
Existem trs escalas de complexidade:
Melhor Caso - mega
Caso Mdio - theta
Pior Caso - micron
Nas trs escalas, a funo f(N) retorna a
complexidade de um algoritmo com entrada de N
elementos

Melhor Caso
Definido pela letra grega (mega)
o menor tempo de execuo em uma entrada de
tamanho N
pouco usado, por ter aplicao em poucos casos.
Ex.:
Se tivermos uma lista de N nmeros e quisermos
encontrar algum deles assume-se que a
complexidade no melhor caso f(N) = (1), pois
assume-se que o nmero estaria logo na cabea da
lista.


Caso Mdio
Definido pela letra grega (Theta)
Dos trs, o mais difcil de se determinar
Deve-se obter a mdia dos tempos de execuo de todas as entradas de
tamanho N, ou baseado em probabilidade de determinada condio ocorrer
No exemplo anterior:
A complexidade mdia P(1) + P(2) + ... + P(N)
Para calcular a complexidade mdia, basta conhecer as probabilidades de
Pi;
Pi = 1/N, 1 <= i <= N
Isso resulta em P(1/N) + P(2/N) + ... + P(N/N)
Que resulta em 1/N(1+2+...+N)

Que resulta em 1 N(N+1) = (N+1)
N 2 2

Que resulta em f(N) = (N+1)
2
Pior Caso
Representado pela letra grega O (micron) ou O
maisculo.
o mtodo mais fcil de se obter. Baseia-se no maior
tempo de execuo sobre todas as entradas de
tamanho N
Ex.:
Se tivermos uma lista de N nmeros e quisermos
encontrar algum deles, assume-se que a
complexidade no pior caso O (N), pois assume-se
que o nmero estaria, no pior caso, no final da
lista.

Complexidade de Algoritmos
Mas como saber qual a complexidade de um
determinado algoritmo implementado?
Para resolver esse problema, dividiu-se os algoritmos
em Classes de Problemas, de acordo com o
parmetro que afeta o algoritmo de forma mais
significativa

Classes de Algoritmos
So elas:
Complexidade Constante
Complexidade Linear
Complexidade Logartmica
NlogN
Complexidade Quadrtica
Complexidade Cbica
Complexidade Exponencial

Complexidade Constante
So os algoritmos de complexidade O(1)
Independe do tamanho N de entradas
o nico em que as instrues dos algoritmos so
executadas num tamanho fixo de vezes
Ex.:
Function Vazia(Lista: TipoLista): Boolean;
Begin
Vazia := Lista.Primeiro = Lista.Ultimo;
End;

Complexidade Linear
So os algoritmos de complexidade O(N)
Exemplo 4:

Complexidade Linear
Uma operao realizada em cada elemento de entrada
Exemplo 5: pesquisa de elementos em uma lista

Procedure Busca(Lista: TipoLista; x: TipoElem; Var pos: integer)
Var i: integer;
Begin
i:=1;
while Lista.Elemento[i] <> x do
i := i+1;
if i >= Lista.MaxTam then
pos := -1
else
pos := i;
End;

Complexidade Linear
Exemplo 6: Determinar a complexidade do lao
for (i = soma = 0; i < n; i++)
soma += a[i];
Primeiro, duas variveis so inicializadas, ento o lao for itera n vezes e,
durante cada iterao, executa duas atribuies, uma das quais a soma e
a outra atualiza i.
Assim, existem 2 +2n atribuies para a rodada completa desse lao for;
sua complexidade O(n).
Complexidade de Linear
Exemplo 7: Determinar a complexidade do cdigo de inverso de
sequncias
for ( i = 1; i <= n/2; i++) {
temp = S[i];
S[i] = S[n-i+1];
S[n-i+1] = temp;
}
Nesse caso o cdigo apresenta a propriedade de o nmero de passos
manter-se o mesmo quando aplicado a entradas diferentes de mesmo
tamanho, isto , para um mesmo valor de n o resultado permanece
constante.
A varivel independente o valor de n, ento as complexidades de pior,
mdio e melhor caso so iguais entre si.
O cdigo sempre efetua [n/2] passos, logo sua complexidade O(n)
E para o caso de soma e multiplicao de matrizes?
Complexidade Logartmica
So os algoritmos de complexidade O(logN)
Ocorre tipicamente em algoritmos que dividem o
problema em problemas menores
Ex.: O algoritmo de Busca Binria

Complexidade NlogN
Como o prprio nome diz, so algoritmos que tm
complexidade O(NlogN)
Ocorre tipicamente em algoritmos que dividem o
problema em problemas menores, porm juntando
posteriormente a soluo dos problemas menores
A maioria dos algoritmos de ordenao externa so de
complexidade logartmica ou N Log N


Complexidade Quadrtica
So os algoritmos de complexidade O(N)
Itens so processados aos pares, geralmente com um loop dentro
do outro

Complexidade Quadrtica
So os algoritmos de complexidade O(N)
Itens so processados aos pares, geralmente com um loop
dentro do outro
Ex.:
Procedure SomaMatriz(Mat1, Mat2, MatRes: Matriz);
Var i, j: integer;
Begin
for i:=1 to n do
for j:=1 to n do
MatRes[i,j] := Mat1[i, j] + Mat2[i,j];

Complexidade Quadrtica
Exemplo 8: Determinar a complexidade do cdigo que produz a
soma de todas as submatrizes que comeam com a posio 0
for (i = 0; i < n; i++) {
for (j = 1, soma = a[0]; j < n-i; j++)
soma += a[j];
cout<<soma para submatriz 0 at <<i<<e <<soma<<endl;
}
Antes que os laos comecem, i inicializado.
O lao mais externo realizado n vezes, executando em cada iterao um
lao for mais interno, uma impresso e as atribuies para 1, j e soma.
O lao mais interno executado i vezes para cada i {1,...,n-1} com
duas atribuies para cada iterao: uma para soma e outra para j.
Assim existem 1+3n+
i=1
n-1
2i = 1+3n+2(1+2+...+n-1)= 1+3n+n(n-1)=
=O(n)+O(n
2
) = O(n
2
) atribuies so executadas antes que o programa
termine.
Complexidade Cbica
So os algoritmos de complexidade O(N)
Itens so processados trs a trs, geralmente com um loop
dentro do outros dois
Ex.:
Procedure SomaElementos_Vetor_Indices_Matriz
(mat: Matriz, vet: Vetor);
Var i, j: integer;
Begin
for i:=1 to n do
for j:=1 to n do
for k:=1 to n do
mat[i, j] := mat[i, j] + vet[k];

Complexidade Exponencial
So os algoritmos de complexidade O(2
N
)
Utilizao de Fora Bruta para resolv-los
(abordagem simples para resolver um determinado
problema, geralmente baseada diretamente no
enunciado do problema e nas definies dos conceitos
envolvidos)
Geralmente no so teis sob o ponto de vista prtico

Ordens mais comuns
n
2
n
f
n log n
(linear)
(exponencial)
log n
(constante)
Clculo da complexidade
Foi visto que, para calcular a complexidade de um
algoritmo, deve-se analisar o pior caso
A anlise deve ser feita no programa todo, de acordo
com a tabela a seguir

Algumas operaes com a notao O
Exemplo 9
Procedure Verifica_Item_Lista
(Lista: TipoLista; x: TipoItem; pos: integer);

Var i: integer;
Begin
i:=1;
achou := false;
while (i <= Lista.Tamanho) and not achou do begin
inc(i);
if Lista.Item[i] = x then
achou := true;
end;
if achou then
pos := i
else pos := -1;
O(1)
O(N)
f(N) = O(9 * O(1) + O(N)) = O(O(1) + (O(N)) = O(N)
O(1)
Exemplo 10
Procedure Verifica_Item(Lista: TipoLista; x: TipoItem; pos:
integer);
Var i: integer;
Begin
i:=1;
achou := false;
while (i <= Lista.Tamanho) and not achou do
if Lista.Item[i] = x then
achou := true;
if achou then
pos := i
else for i:= Lista.Tamanho +1 to MaxTam;
Lista.Item[i] := x;
O(1)
O(N)
O(1)
f(N) = O(7 * O(1) + 2*O(N)) = O(O(1) + (O(N)) = O(N)
O(N)
O(1)
Exerccio 7
1. Escrever as seguintes funes em notao O:
n
3
1 n
2
+ 2 log n 3n
n
+5 * 2
n
(n-1)
n
+ n
n-1
2. Certo ou errado:
E - Se f,g so funes tais que f=O(g) e g= (f) ento f = (g)
E - Se a complexidade de melhor caso de um algoritmo for f, ento o
nmero de passos que o algoritmo efetua, qualquer que seja a entrada
(f)
E - Se a complexidade de pior caso de um algoritmo for f, ento o
nmero de passos que o algoritmo efetua, qualquer que seja a entrada
(f)

Listas Lineares
Listas Lineares
So estruturas que permitem representar um
conjunto de dados de forma a preservar a relao de
ordem linear (ou total) entre eles.*
Definio:
conjunto de n > 0 ns X1, X2, X3, ..., Xn, organizados
estruturalmente de forma a refletir as posies
relativas dos mesmos:
Se n > 0, ento X1 o primeiro n e Xn o ltimo
n. Quando n=0 a lista vazia:


Operaes com Listas Lineares
Acessar o k-simo n para obter ou alterar seu
contedo
Inserir um novo n aps (ou antes) o k-simo n da
lista
Remover o k-simo n da lista
Concatenar duas listas
Determinar o nmero de ns de uma lista
Localizar o n que contm um dado valor
Algoritmo para Acessar o K-simo N de uma Lista
Algoritmo AcessarKesimo;
var x:vet[1..10] de int;
k,fim: int; sinal:log, val: int;
Inicio
x[2] 3; leia(k); fim 5; {Uso 5 elementos da lista}
Se (K=<0) ou (k>fim) {Verifica a validade de K}
Entao sinal false Senao Inicio
val x[k];
sinal true;
Fim;
Escreva (O k-simo vale: ,x[k]);
Fim.
Programa para Acessar o K-simo N de uma Lista
Algoritmo para Alterar o valor do K-simo N
Algoritmo AlterarKesimo;
var x:vet[1..10] de int;
k,fim: int; sinal:log, val: int;
Inicio
x[3] 1; leia(k); leia(val);
fim 5; {Uso 5 elementos da lista}
Se (K=<0) ou (k>fim) {Verifica a validade de K}
Entao sinal false
Senao
Inicio
x[k] val;
sinal true;
Fim;
Escreva (O k-simo vale: x[,k,]= ,x[k]);
Fim.

Algoritmo para Inserir um Novo N
Algoritmo InserirKesimo;
var x:vet[1..10] de int;
i,k,fim: int; sinal:log, val: int;
Inicio
leia(k); leia(val); fim 5; {Uso 5 elementos da lista}
Se (K=<0) ou (k>fim) Entao sinal false {Verifica a validade de K}
Senao
Para i fim inc -1 ate K Faa
Inicio
x[i+1] x[i]; fim fim+1;
x[k] val; sinal true;
Fim;
Escreva (O k-simo vale: x[,k,]=,x[k]);
Fim.
Supe-se que haja ao menos um elemento disponvel
Programa para inserir um novo n
Algoritmo para Remover o K-simo da Lista
Algoritmo RemoverKesimo;
var x:vet[1..10] de int;
i,k,fim: int; sinal:log, val: int;
Inicio
leia(k); leia(val); fim 10; {Uso todos elementos da lista}
Se (K=<0) ou (k>fim) Entao sinal false {Verifica a validade de K}
Senao
Inicio
Para i k inc 1 ate Fim-1 Faa x[i] x[i +1];
fim fim-1;
sinal true;
Fim;
Escreva (O k-simo vale: x[,k,]=,x[k]);
Fim.

Programa para remover um n
Listas Encadeadas
Resolvem o problema do comprimento mximo da
lista permitindo a alterao dinmica do tamanho da
lista aumentando seu comprimento inicial. Neste tipo
de lista, cada n alm de conter o dado propriamente
dito, dever tambm conter a indicao do n
seguinte, caso existir (contiguidade lgica).
X1 X2 Xn-1 Xn
...
Representao: referncia tipo no:: reg(dado: real,
proximo: ref no);
dado proximo var primeiro: ref no;

p^.dado p^.proximo
Obteno dos Ns
A obteno dos ns para compor a lista feita por
meio do comando new(p) onde p tambm uma
varivel do tipo referncia a n.
New(p) : aloca dinamicamente um espao na memria
do computador correspondente a um n. O endereo
deste espao atribudo varivel p.

Exemplo: Desenvolvimento de um algoritmo para
criao de uma lista encadeada com um n apenas;

Algoritmo para a criao de um n
Algoritmo listaUmNo;
tipo no:: reg(dado: real, proximo: ref no); {especifica o tipo de no}
var lista, p: ref no; valor: real; {lista e p apontam p/no}
Inicio
lista nil; { lista recebe nil}
leia (valor); {le um dado em coloca em valor}
new(p); { aloca 1 no o valor de p e o endereco do no}
p^.proximo lista; { o componente proximo de p recebe lista}
lista p; { lista recebe o valor da variavel p}
p^.dado valor; { ou lista^.dado valor}
Fim;
Para incluir um outro n
(1) new(p);
(2) p^.proximo lista;
(3) lista p;
Para remover o ltimo n de uma lista
(1) p lista;
(2) lista p^.proximo; {ou lista lista^.proximo;}
(3) dispose(p);
Ao remover o
ltimo n da
lista, esta voltar
situao inicial
de lista vazia:
lista
/

Exemplo
Algoritmo para determinar o comprimento de uma
lista encadeada.
Algoritmo MedeLista;
Tipo no::reg(dado:real; proximo: ref no); Enquanto p^;proximo>< nil Faa
Var lista, p: ref no; valor: real; Inicio
INICIO q p;
...... p p^.proximo;
Se lista = nil Entao execute rotinaerro2 fim;
Senao Se lista^.proximo= nil Entao q^.proximo nil;
Inicio dispose(p);
dispose(lista); Fim;
lista nil; ...........
Fim FIM.
Senao Inicio
p lista;

Listas com Descritor
Listas com Descritor
Simplificam a representao das listas encadeadas
pois reunem em um s elemento as referncias do
primeiro e do ltimo elemento da lista chamado n
descritor ou lder da lista.
O n descritor:
tipo descritor :: reg (i: ref n;
n: int;
f: ref n);

Neste caso a representao da lista vazia :

Utilizando listas com descritor
Nesse tipo de lista deve-se criar uma lista vazia, que
consiste em:
1. Alocar um n do tipo descritor;
2. Tornar suas duas referncias nulas; e
3. Fazer a varivel que indica o incio da lista apontar
para o n.
O procedimento ao lado Proc criar (d: ref descritor)
implementa incio
esta operao: aloque(d);
d^.i nil;
d^.n 0;
d^.f nil;
fim
Inserindo um n esquerda da lista
Inserimos um n com
um dado valor esquerda
da lista cujo descritor
apontado pela varivel d.
Inserindo um n direita da lista
Inserimos um n com
um dado valor direita
da lista cujo descritor
apontado pela varivel d.
Removendo um n da esquerda
O procedimento a seguir remove o primeiro n da
lista, se houver, e retorna o dado que o n removido
continha atravs
do parmetro valor.
Para remover um n
da lista devemos
percorrer todos os
ns da lista a partir
do primeiro (esq)
at atingir o n da
direita.
Pilhas e Filas
Pilhas e filas
So utilizadas em aplicaes onde so impostos
critrios para a insero e retirada de elementos cuja
ordem no depende da ordem natural dos valores dos
dados. So 2 os critrios mais usados:
LIFO last in first out: o primeiro a ser retirado o
ltimo que tiver sido inserido, ex.: pilha de pratos;
FIFO first in first out: o primeiro elemento a ser
retirado o primeiro que tiver sido inserido, ex.:
fila de banco.

Pilhas
Pilhas
So estruturas essencialmente dinmicas.
Implementamos utilizando sequncias. Supondo que
os elementos do conjunto so do tipo dado (pilhas de
dados), j definido, podemos definir:
tipo
pilha_seq:: seq dado;
var
p: pilha_seq;
i,j: dado;
Inicialmente a pilha est vazia: p<- <>
Empilhar e Desempilhar
Para inserir um elemento i (empilhar):
p <- < i > conc p
Para retirar um elemento (desempilhar):
p <- cont p
Obs.: o ltimo elemento inserido da pilha o
primeiro componente da sequencia.
Caso a pilha esteja vazia, a retirada de um elemento
no implica em erro pois a continuao da sequncia
nula a prpria sequncia nula.
Acesso ao topo da pilha
Em geral, s se admite acesso ao elemento do topo
da pilha (o ltimo inserido). Para se obter esse
elemento fazemos:
Se p =< > entao
erro {pilha vazia}
seno j<- princ p
Por serem estruturas dinmicas as pilhas podem
crescer e decrescer aleatoriamente durante a
execuo do programa.
Definindo o tipo pilha
Quando se pode prever o tamanho mximo de uma
pilha, possvel implementa-la por meio de registros
contendo um n inteiro e um vetor de dados:
tipo
pilha_vet :: (topo: int;
elementos: vet[1..100] de dado);
var
p: pilha_vet;
i,j: dado;
Definindo e inicializando uma pilha em Pascal
Inicializando a pilha e empilhando
A inicializao como pilha vazia faz-se por:
p.topo <- 0;
Para o empilhamento, devemos verificar se ainda h
espao no vetor para mais um elemento:
Se p.topo = 100 entao erro {excesso de elementos}
Senao inicio
p.topo <- p.topo + 1;
p.elementos[p.topo] <- i;
fim
Desempilhando
Para o desempilhamento, verifica-se se a pilha est
vazia:
Se p.topo = 0 entao nada {a pilha esta vazia}
senao p.topo <- p.topo - 1;
Para obter o elemento do topo:
Se p.topo = 0 entao erro {a pilha esta vazia}
senao j <- p.elementos[p.topo]

Programa para empilhar e desempilhar
Filas
Filas
Enquanto Pilhas sofrem inseres e retiradas na
mesma extremidade (o topo), as filas exigem acesso
s duas extremidades:
a) comeo - onde feita a retirada; e
b) fim - onde feita a insero.
Definio de filas - forma geral:
tipo
fila_vet :: reg (comeco:int; termino:int;
elementos: vet [1..10] de dado);
var
f: fila_vet; i,j: dado;
Operaes bsicas
Inicializao
f.comeco <- 1;
f.termino <- 0;
Insero
Se f.termino =10 entao erro {excesso de elementos}
Senao inicio
f.termino <- f.termino + 1;
f.elementos[f.termino] <- i;
fim;
Definindo e inicializando filas
Operaes bsicas
Retirada:
Se f.termino < f.comeco
entao nada { fila vazia }
Senao
f.comeco <- f.comeco + 1;
Consulta ao elemento no comeo da fila
Se f.termino < f.comeco entao erro {fila vazia}
Senao
j <- f.elementos[f.comeco];
Representao na memria
Aps a inicializao, a fila vazia tem o seguinte
aspecto:



A atribuio do valor 1 inicial a f.comeco para
garantir que f.termino < f.comeco notando que se
f.comeco = f.termino no indica fila vazia e sim uma
fila com somente um elemento. A insero dos
elementos: 26,18,12,9,3,11,4,2,13 faz:
Representando na memria
Havendo 4 retiradas da fila temos:



Como a retirada envolve o incremento de f.comeco nota-
se que a fila vai se deslocando da esquerda para a
direita do vetor.
Para inserir mais um elemento (17, por exemplo)
soma-se 1 a f.termino, o qual passa a conter o ndice
10, posio em que colocamos o valor 17. Se agora
quisermos inserir mais um valor, isso no ser
possvel (f.termino = 10 indica erro se for tentada
uma insero) o que de certo modo absurdo, j que
as posies 1 a 4 esto livres

Resolvendo inconsistncias
Para permitir a reutilizao de posies j ocupadas,
inserimos mais um componente f.tamanho que
indica quantos elementos existem na fila no
momento. Portanto as operaes sero executadas
conforme os algoritmos:
Inicializao:
f.comeco <- 1;
f.termino <- 0;
f.tamanho <- 0;
Resolvendo inconsistncias
Insero:
Se f.tamanho = 10 entao erro {excesso de elementos}
Senao inicio
f.tamanho <- f.tamanho + 1;
f.termino <- (f.termino mod 10) + 1;
f.elementos[f.termino] <- i;
fim;
Antes de incrementar f.termino tomamos o resto de sua
diviso pelo n de elementos do vetor, ex.: para
inserir mais um elemento, f.termino ser calculado por
10 mod 10 + 1 e o novo elemento ser inserido na
primeira posio do vetor.
Resolvendo inconsistncias
Retirada:
Se f.tamanho = 0 entao nada {fila vazia}
Seno inicio
f.tamanho <- f.tamanho - 1;
f.comeco <- (f.comeco mod 10) + 1;
fim;
Consulta:
Se f.tamanho = 0 entao erro {fila vazia}
Senao
j <- f.elementos[f.comeco];


Trabalho Individual 1
Desenvolver um programa que seja capaz de avaliar expresses
aritmticas inteiras utilizando a estrutura de dados Pilha. Utilizar os
operadores: +, -, *, / (div), % (mod), ^ (potncia).
Supor que as expresses possuem identificadores contendo somente
uma nica letra em maiscula, conforme visto em sala de aula. Seu
programa deve possibilitar a leitura de expresses do tipo:
A*B+C/B-A%D^3
Obs.: A expresso deve ser corretamente parentizada pelo usurio
antes de ser analisada.

Valor do trabalho: 5.0 pts.
Referncia Bibliogrfica: PEREIRA, S. L. Estrutura de dados
fundamentais: conceitos e aplicaes. So Paulo: Erica, 1996.
Trabalho Individual 2
Um simulador um programa que modela o funcionamento de algum fenmeno do mundo real. Ele deve
tratar eventos que ocorrem no decorrer do tempo. Para isso, ele implementa um motor de simulao, que
gerencia o funcionamento do simulador. A passagem do tempo implementada atravs de ciclos. Em cada
ciclo o motor de simulao deve:
Gerar eventos aleatoriamente;
Tratar o prximo evento.
- Funcionamento de um Simulador de Aeroporto:
O aeroporto apresenta 3 pistas que podem ser usadas para pousos ou decolagens. Duas pistas comportam
avies de grande e pequeno porte. A terceira pode ser usada apenas por monomotores (pequeno porte). A
escolha da pista a ser usada para pouso ou decolagem realizada pela torre de controle, que tem como
objetivo otimizar o uso das pistas sem provocar colises ou acidentes por falta de combustvel.
Colises ocorrem quando dois avies usam a mesma pista no mesmo
Instante. O problema da falta de combustvel ser descrito a seguir.
A cada instante (ciclo do simulador):
o Um nmero varivel de avies pode chegar ao aeroporto.
o Os avies aguardando pouso tm sua quantidade de combustvel decrescida de uma unidade. Esta
quantidade atribuda pelo simulador (aleatoriamente) no instante em que o avio chega no aeroporto.
o Cabe torre de controle gerenciar uma fila de pousos de forma que no ocorram quedas de avies por falta
de combustvel.
o A torre de controle pode autorizar um pouso ou decolagem em cada pista.Ao final, o simulador deve gerar
alguns eventos estatsticos, como por exemplo, aquantidade de avies que pousaram, quantos decolaram, etc
rvores
Baseado em:
Material do prof. L. Baldochi
http://pt.wikipedia.org/wiki/arvore_binaria
rvores
Utilizadas em muitas aplicaes
Modela uma hierarquia entre elementos
rvore genealgica
Diagrama hierrquico de uma organizao
Modelagem de algoritmos
O conceito de rvores est diretamente ligado recurso
rvores
Um conjunto finito de elementos onde
um elemento chamado de raiz
os outros so divididos em subconjuntos disjuntos,
onde cada um define uma rvore
cada elemento um n ou vrtice da rvore
arcos ou arestas conectam os vrtices
rvores
Uma coleo no vazia de vrtices e ramos que satisfazem
a certos requisitos
vrtice (ou n):
um objeto simples que pode ter um nome e mais
alguma outra informao associada
arco ou aresta (direcionado ou no):
uma conexo entre dois ns

Representao
r v o r e
E F
B
G H I
C
L M
O
S
P Q R
N
K
J
C
A
Terminologia e Propriedades
cada vrtice (exceto a raiz) tem exatamente um
antecessor imediato ou pai
cada vrtice tem ns sucessores imediatos ou filhos, a no
ser:
ns sem filhos terminais ou folhas ou externos
filhos de um mesmo pai - irmos
ns com pelo menos um filho no-terminais ou internos
Terminologia e Propriedades
caminho em uma rvore:
uma lista de vrtices distintos e sucessivos,
conectados por arcos (arestas) da rvore
n raiz
existe exatamente um caminho entre a raiz e cada
um dos ns da rvore
se existir mais de um caminho ou nenhum grafo
Terminologia e Propriedades
grau
o nmero de subrvores de um n
no exemplo: grau de A 3; de N 4; de J 1
qualquer n a raiz de uma sub-rvore consistindo dele e
dos ns abaixo
r v o r e
E F
B
G H I
C
L M
O
S
P Q R
N
K
J
C
A
rvores
r v o r e ( 1 )
E F
B C
G
D
A
r v o r e ( 2 )
C
G
D
E F
B
A
rvores
A nica diferena entre as duas rvores a ordem das sub-
rvores
Uma rvore ordenada definida como uma rvore onde
as sub-rvores formam um conjunto ordenado
Em uma rvore ordenada define-se o primeiro, segundo
e ltimo irmo, de acordo com alguma propriedade
Terminologia
os vrtices da rvore esto classificados em nveis
o nmero de ns no caminho entre o vrtice e a raiz
E F
B
G H I
C
L M
O
S
P Q R
N
K
J
D
A
nvel da raiz zero
nvel de C 1
nvel de K 3
nvel de um n =
nvel de seu pai + 1
nvel de P 5
Terminologia
Altura de uma rvore
corresponde ao maior nvel
maior distncia entre a raiz e qualquer n
Floresta
um conjunto de rvores
se removemos a raiz e os arcos que a ligam s sub-
rvores, ficamos com uma floresta
rvore Binria
um conjunto finito de elementos que ou vazio ou
composto de trs conjuntos disjuntos (aqueles sem
elementos em comum)
o primeiro contm um nico elemento, a raiz
os outros dois subconjuntos so rvores binrias
as sub-rvores da esquerda e da direita
As sub-rvores da esquerda ou da direita podem
estar vazias
rvore Binria
A
B
G
F E D
C
H I
U
A
B
C
D
E F
G
H I
rvores Binrias
Considerando que os dois filhos de cada n interno so
ordenados:
o filho da esquerda e
o filho da direita
Cada n interno tem que ter filho da direita ou da
esquerda, sendo que um ou ambos podem ser ns
externos
rvores Binrias
uma rvore binria vazia:
consiste de nenhum n interno e um n externo
uma rvore binria uma rvore ordenada, na qual cada n
tem 0, 1, ou 2 filhos
cada filho corresponde a uma rvore binria

rvores Binrias
O nmero de sub-rvores a esquerda e a direita vazias em
uma rvore binria com n ns de n+1
se n = 1 ento 2 subrvores vazias

se n = 2 ento 3 subrvores vazias

Se vale para n 1 ento, em uma rvore com n ns
uma subrvore vazia foi substituda por um vrtice interno e
2 subrvores vazias
o nmero de subrvores vazias ento:
n -1+2 = n +1
rvores Binrias
Definio de rvores
uma rvore um nico n ou um n raiz conectado a um
conjunto de rvores

Definio de rvores Binrias
uma rvore binria um n externo ou um n raiz (interno)
conectado a esquerda e a direita a rvores binrias
rvore Binria Estrita
todo n no folha possui filhos a esquerda e a direita
rvore Binria Estrita

Uma rvore binria estrita com n folhas sempre contm 2n-
1 ns
rvore Binria Estrita
B
F G
D E
C
A
rvore Binria Estrita
B
F
G 1 G 2
G
D E
C
A
rvore Binria Estrita
rvore binria estrita com:
1 folha um n
2 folhas 3 ns
hiptese: n folhas 2n-1 ns
rvore Binria
Nvel:
A raiz tem nvel 0
A raiz de outro n o nvel do n pai +1.
A profundidade de uma rvore o maior nvel para todas as
folhas
Markeson: raiz tem nvel 1
Langsan : raiz tem nvel 0
rvore Binria
rvore binria cheia de nvel d: rvore binria estrita com
todas as folhas no nvel d

rvore binria completa de nvel d: uma rvore binria
estrita com todas as folhas no nvel d ou no nvel d-1
rvore Binria Completa
D E
B
H I
F G
C
A
rvore Binria Cheia
H I
D
J K
E
B
L M
F
N O
G
C
A
Exerccio 8
Classificar:
A) B)
rvore Binria
Para muitas aplicaes, importante a relao entre altura
e nmero de ns
rvore Binria de altura mxima
F
E
D
C
B
A
Para rvores com n ns:
altura mxima: cada n no
folha s possui um filho -
ziguezague
sua altura n-1

rvore Binria - altura mnima
Seja T uma rvore binria de altura mnima
Se T no completa retira-se uma folha w de seu ltimo nvel e
coloca-se como filho de uma folha de nvel superior (acima do
penltimo)
Repete-se a operao at no ser possvel mais realiz-la
A rvore resultante T completa
Se a altura de T for menor que a de T esta no seria mnima.
T no pode ser de altura maior nenhum n foi retirado
T e T possuem a mesma altura
rvore Binria - altura mnima
Nvel 0 (somente a raiz) contm um n
Nvel 1 contm no mximo 2 ns
.....
No nvel L - pode conter no mximo 2
L
ns

rvore binria cheia de altura d tem exatamente 2
L
ns em
cada nvel 0 s L

s d
rvore Binria
O total de ns n em uma rvore binria cheia (que seria o
mximo) de altura d a soma do nmero de ns a cada nvel
d
n = 2
0
+ 2
1
+ 2
2
+ ..... + 2
d =
E

2
j
j=0

n =

2
d+1
-1

d = log (n+1) 1

pode-se mostrar tambm por induo!
OBS.: nmero de folhas de uma rvore cheia com n ns
2
d
= 2
log(n+1)-1
= 2
log(n+1)
= n+1

2 2
rvore Binria Cheia
H I
D
J K
E
B
L M
F
N O
G
C
A
rvore Binria Cheia de altura 3
2
3+1
-1 = 15 ns
rvore Binria Cheia
a rvore binria com o mximo de ns para uma dada
altura, mas
a distncia da raiz pequena

Lema: Seja T uma rvore binria completa com n>0 ns.
Ento, T possui altura h mnimo. Alm disso, h = log n

rvore Binria Completa
Seja T uma rvore binria completa com n ns, ento sua
altura h = log
2
n

Seja T a rvore obtida pela remoo dos k ns do ltimo
nvel
T cheia j que T s tinha folhas no ltimo e no
penltimo nvel (definio de completa)
ns de T
n = n - k = 2
d +1
-1 , onde d a altura de T
rvore Binria Completa
h(T) = d e h(T) = d+1
d = log
2
(n+1) -1
h(T) = log
2
(n+1) -1 +1 = log
2
(n+1)
e k? (no mximo nmero de folhas da rvore cheia 2)
1 s k

s n +1
h(T) = log
2
(n+1) = log
2
(n + k) = log
2
(n)


Exerccio 8 a
1. Uma rvore cheia tem 1023 ns. Qual sua
profundidade e o nmero de ns terminais?
Resposta: 9 e 512.
2. Uma rvore completa tem 37 ns. Qual sua
profundidade e o nmero de ns terminais?
Resposta: 5 e 19.
3. Uma rvore completa tem 37 ns terminais. Qual sua
profundidade e nmero total de ns?
Resposta: 6 e 73.
Representando rvores Binrias
typedef struct {
int info;
tipo_no * esq;
tipo_no * dir;
} tipo_no;
B C
A
A
B
C
Representando rvores Binrias
Typedef struct {
char info;
tipo_no * esq;
tipo_no * dir;
tipo_no * pai;
} tipo_no
B C
A
A
B
C
Representando rvores Binrias
Na representao ns externos
podem ser
NULL
ponteiro para o prprio n
B C
A
A
B
C
Representando rvores Binrias
a * b + d - e * ( f + g )
a b
*
f g
+ e
*
-
Representando Florestas
rvores binrias possuem dois ponteiros em cada n interno,
um para cada filho, e portanto sua representao imediata
O que fazer para rvores gerais ou florestas, com um nmero
arbitrrio de filhos por n, que requerem um nmero arbitrrio
de ponteiros

Representao depende da Aplicao
Representando Florestas
Se no necessrio caminhar para os nveis de baixo da
rvore mas s para os de cima
Percorre-se a vores dos ns terminais para os no
terminais e por ltimo a raiz
B C
A
B
A
C
Representando Florestas
typedef struct {
char info;
tipo_no * filho;
tipo_no * irmo;
} tipo_no
A
B
C
D
E
D E
B C
A
Representando Florestas
Se necessrio caminhar para os nveis mais altos
Empregar uma lista encadeada conectando o n com seus
irmos e outra com seus filhos
Ao invs de empregar um n dummy para terminar cada lista
pode-se apontar de volta para seu pai permitindo mover para cima
ou para baixo
Esses ponteiros para pai tem que estar marcados para poder
ser distingui-los dos ponteiros para irmos
Alternativamente pode-se armazenar o nome do pai de forma
que a busca pra quando o n for revisitado
Representando Florestas
Essa representao cada n possui exatamente dois
ponteiros
1 para filho e
1 para um irmo
Onde est a diferena entre essa estrutura e uma rvore
binria??
no existe
Visite(p) contedo do n apontado por p
Esquerda(p) ponteiro para o filho da esquerda de
Direita(p) ponteiro para o filho da direita de p
Pai(p) ponteiro para o pai de p
Irmo(p) ponteiro para o irmo de p
eh_esq(p) Retorna true se p filho da esquerda e
se filho da direita
eh_dir(p) Retorna true se p filho da esquerda e
se filho da direita
Operaes em rvores Binrias
Operaes em rvores Binrias
p = cria(x) Cria uma AB com apenas um n com contedo x
Retorna o ponteiro para a nova rvore.
resp = filho_esq(p,x) Cria um filho esquerda do n apontado por p, com
contedo x.
Retorna false caso j exista um filho esquerdo e true
caso contrio.
resp = filho_dir (p,x) Cria um filho direita do n apontado por p, com
contedo x.
Retorna false caso j exista um filho direito e true
Aplicaes Com rvores Binrias
uma estrutura til quando uma de duas decises devem
ser tomadas no decorrer do processo.
Encontrar todas as duplicatas em uma lista de
nmeros
Uma forma de fazer isso comparar o nmero com
todos os que o precedem
isto no uma soluo eficiente

Aplicaes Com rvores Binrias
Soluo: empregar uma rvore binria
Armazenam-se os nmeros na rvore de forma a:
O 1 nmero armazenado na raiz de uma rvore com
apenas um n interno
Cada um dos prximos nmeros na lista comparado com a
raiz:
caso seja igual uma duplicata
caso seja menor, armazenado na sub-rvore da direita
seguindo-se recursivamente o mesmo procedimento
caso seja maior, armazenado na sub-rvore da esquerda
seguindo-se recursivamente o mesmo procedimento

Aplicaes Com rvores Binrias
14, 18, 4, 9, 7, 15, 3, 5, 17, 4, 20, 9, 5
3
5
7
9
4
17
15 20
18
14
Aplicaes com rvores Binrias
Outra aplicao comum atravessar a rvore binria,
visitando cada n
como sistematicamente visitaremos cada n?
Operao trivial para listas lineares
Para rvores, existem diferentes formas de proceder
os mtodos diferem conforme a ordem em que se
visitam os ns
Atravessando rvores Binrias
Mtodos
Pr-ordem:visite a raiz, ento visite a subrvore da
esquerda, depois a subrvore da direita
Em-ordem ou ordem simtrica: visite a subrvore da
esquerda, ento visite a raiz, depois a subrvore da
direita
Ps-ordem: visite a subrvore da esquerda, ento visite a
subrvore da direita, depois a raiz
pr-ordem:
- * a b * + f g e


em-ordem:
a*b - f+g * e


ps-ordem:
a b * f g + e * -
Atravessando rvores Binrias
a * b + d - ( f + g ) * e
a b
*
f g
+ e
*
-
Atravessando rvores Binrias
Implementao simples dos mtodos - recursiva
Como se visita uma subrvore de cada vez,
seguindo-se a regra recursiva , cada subrvore
visitada comeando pela raiz
Pr-ordem
pre_ordem (pt)
{
if (pt == NULL) return ();
visite(raiz);
pre_ordem (pt->esq);
pre_ordem (pt-> dir);
}

em-ordem
em_ordem (pt)
{
if (pt == NULL) return ();
em_ordem (pt->esq);
visite(raiz);
em_ordem (pt-> dir);
}

Ps-ordem
pos_ordem (pt)
{
if (pt == NULL) return ();
pos_ordem (pt->esq);
pos_ordem (pt-> dir);
visite(raiz);
}

Exerccio 9
Representar, atravs de uma rvore, a seguinte
expresso aritmtica:
[(a+b)(c+d)/e]-[(f+g)h]
Justificar!

A partir dos procedimentos anteriores montar um
programa completo para atravessamento em-ordem
rvore Binria Completa
Representao em lista sequencial
Cada n pode receber um nmero de 1 a N
Um n de nmero i est na posio i da lista
Seus filhos da esquerda e da direita nas posies 2i+1 e
2i+2, respectivamente

No necessita ponteiros
Restringe um tamanho para a rvore
Tambm chamada de representao seqencial
H
(8)
I
(9)
D
(4)
E
(5)
B
(2)
F
(6)
G
(7)
C
(3)
A
(1)
A B C D E F G H I
rvore Binria quase Completa
Exerccios 10
1. Implementar os procedimentos pr-ordem, em-
ordem e ps-ordem de forma no recursiva

2. Calcular a altura de cada n de uma rvore binria

Em-ordem
p = raiz;
do { /* segue pelo ramo da esq. at NULL */
while (p != NULL) {
push(p);
p=p->esq;
}
/* verifica se j processou toda rvore */
if (pilha_no_vazia()){
p = pop();
visite(p);
p = p->dir;
}
} while(pilha_no_vazia() || p != NULL);
}
H I
D E
B C
A
rvore Binria de Busca
Construda de tal forma que, para cada n:
Ns com chaves menores esto na sub-rvore
esquerda
Ns com chaves maiores (ou iguais) esto na sub-
rvore direita

A insero dos ns da rvore deve satisfazer a essa
propriedade
rvore Binria de Busca
Para a busca de uma chave v na rvore binria de busca:
Primeiro compare com a raiz
Se menor, v para a sub-rvore esquerda
se maior, para a sub-rvore direita

Aplique o mtodo recursivamente

Exerccio 10a
Dos exemplos abaixo quais so rvores binrias de busca:








Sim sim no
rvore Binria de Busca
2
3 5
4
6 9
8
6
rvore Binria de Busca
2
3 5
4
6 9
8
6
rvore Binria de Busca
2
3 5
4
6 9
8
6
rvore Binria de Busca
A cada passo, garante-se que nenhuma outra parte da
rvore contm a chave sendo buscada

O procedimento pra quando
O n com v encontrado
Seno, chega-se a NULL
rvore Binria de Busca
busca_arvore_nao_recursivo (v, pt)
{
do {
if (v < pt->info)
pt = pt-> esq;
else pt = pt-> dir;
}while (pt != NULL) && (v != pt->info);
return(pt);
}
Inserindo em rvore Binria de Busca
Para inserir um n na rvore:
fazer uma busca com insucesso
alocar um novo n
necessrio saber por qual n se chegou a NULL
ser o pai do novo n
Inserindo em rvore Binria de Busca
Inserindo em rvore Binria de Busca
Inserindo em rvore Binria de Busca
Inserindo em rvore Binria de Busca
Inserindo em rvore Binria de Busca
Inserindo em rvore Binria de Busca
Inserindo em rvore Binria de Busca
Inserindo em rvore Binria de Busca
Inserindo em rvore Binria de Busca
2
3 5
4
7
6 9
8
6
Insero rvore Binria de Busca
insere_rvore (int valor, tipo_n * pt)
{ tipo_n * pai;
do{ pai = pt ;
if (valor < pt->chave) pt = pt ->esq ;
else pt = pt->esq;
} while(pt != NULL);
if (pt == NULL){
pt = aloca();
pt ->chave = valor; pt->esq = NULL; pt->dir = NULL;
if (v < pai->chave) pai ->esq = pt ;
else pai ->dir = pt ;
return(pt);
}
}
Insero rvore Binria de Busca
A rvore est classificada se percorrida da forma correta
(pre, pos ou em-ordem?)
as chaves aparecem em ordem se lidas da esquerda
para a direita
Podemos ordenar uma sequncia como se fosse uma
srie de inseres
o programa tem apenas os ponteiros para se
preocupar
Remoo em rvore Binria de Busca
At ento, vimos que a implementao da operao de
insero simples

A remoo de um elemento j mais complexa
remoo de um n folha
os ponteiros esquerdo e direito do pai so setados para
NULL
se possui apenas um filho
o ponteiro apropriado do pai passa a apontar para o filho
se o n possui dois filhos
se um desses dois filhos no possui filhos, use esse n para
substituir o n removido


Remoo em rvore Binria de Busca

Seno: substituir o valor do n a ser removido
substitua este com o elemento cuja chave
imediatamente maior (ou menor)
sempre folha?
seno for folha v repetindo o procedimento
algoritmo?
Remoo em rvore Binria de Busca
2
3 5
4
8
7 10
9
6
Removendo 5:
basta que o ponteiro a direita de 4 aponte para NULL
Remoo em rvore Binria de Busca
2
3
4
8
7 10
9
6
Removendo 5:
basta que o ponteiro a direita de 4 aponte para NULL
Remoo em rvore Binria de Busca
Removendo 3:
basta substituir o n 3 pelo n 2
continua valendo a regra de formao da rvore
2
3 5
4
8
7 10
9
6
Remoo em rvore Binria de Busca
Removendo 3:
asta substituir o n 3 pelo n 2
continua valendo a regra de formao da rvore
2 5
4
8
7 10
9
6
Remoo em rvore Binria de Busca
Removendo 4:
basta substituir 4 pelo 5
continua valendo a regra de formao da rvore

2
3 5
4
8
7 10
9
6
Remoo em rvore Binria de Busca
Removendo 4:
Basta substituir 4 pelo 5
continua valendo a regra de formao da rvore

2
3
5
8
7 10
9
6
Remoo em rvore Binria de Busca
Removendo 7 (raiz):
substituir o 7 pelo imediatamente maior: 8 como
determinar?
resulta na remoo do elemento de chave 8
2
3 5
4
9
8
12
11
10
7
Remoo em rvore Binria de Busca
Removendo 7 (raiz):
substituir o 7 pelo imediatamente maior: 8 como
determinar?
resulta na remoo do elemento de chave 8
2
3 5
4
9
8
12
11
10
8
Remoo em rvore Binria de Busca
Removendo 7 (raiz):
substituir o 7 pelo imediatamente maior: 8 como
determinar?
resulta na remoo do elemento de chave 8
2
3 5
4
9
12
11
10
7
rvore Binria de Busca
A rvore obtida depende da seqncia de insero de ns
Para que a rvore binria de busca seja completa
completa tem altura mnima
o conjunto das chaves deve ser reordenado
rvore comum - O (n)
rvore completa - O (log n)

rvore Binria de Busca
Uma rvore binria de busca completa

o conjunto das chaves deve ser re-ordenado
sejam s
o
e s
n+1
duas chaves fictcias e j inseridas
a cada passo inserir em T uma nova chave que seja de
ndice mdio entre i e j - duas chaves j inseridas



rvore Binria de Busca
rvore completa: tima para a busca
quando a freqncia de acesso aos ns igual

Normalmente estas freqncias so diferentes

interessante construir uma rvore binria que seja a
melhor possvel no que diz respeito busca para freqncias
conhecidas
Eficincia da rvore de Busca
Depende da ordem original dos dados
Se o array original est ordenado (ascendente ou descendente), as
rvores resultantes s tem filhos a direita ou a esquerda
a insero do 1o. n - 0 comparaes
a insero do 2o. n - 2 comparaes
a insero do 3o. n - 3 comparaes
2 + 3 +....+n = n*(n+1)/2 -1
Complexidade - O(n
2
) - para inserir n ns
Eficincia da rvore de Busca
Se a lista original estiver organizada, e se uma rvore
completa (parecida com completa) for se formando:

complexidade da insero = O( n log n )
Eficincia da rvore de Busca
12, 8, 17, 4, 26
A rvore balanceada

4
8
26
17
12
rvores AVL
Baseado em:
Material do prof. D. Lobato
http://pt.wikipedia.org/wiki/arvore_binaria
Baseado em:
Material do prof. D. Lobato
http://pt.wikipedia.org/wiki/arvore_binaria
rvores AVL
Os algoritmos convencionais podem gerar rvores
degeneradas ou timas
rvores de crescimento irrestrito
rvores AVL (Adelson-Velskki & Landis)
rvores de busca binria auto-balanceada
Nesse tipo de rvore, al alturas das duas sub-rvores a partir
de cada n difere no mximo em uma unidade.
Mesmo depois de incluses e excluses o custo se mantem O
(log n) onde n o numero de ns
Inseres e eliminaes podem requerer o rebalanceamento
da rvore, exigindo uma ou mais rotaes.
AVL uma ABB com |Ah| s 1
AVL
Observe as rvores abaixo:
Todas armazenam os
Mesmos dados.
Qual delas a melhor?
E a pior?
No pior caso, quantas
Comparaes so
Necesssrias para
Encontrar um elemento
Na rvoce a) e na
rvore b)?
AVL
Balanceamento:
Dizemos que uma rvore est balanceada em altura (ou profundidade)
quando, para cada n, a diferena entre as alturas de suas sub-rvores
igual a -1, 0 ou 1.
AVL
rvore no AVL








A mesma rvore aps balanceamento por
altura, agora AVL
AVL
Fator de equilbrio de um n
Fe(A) = hEsq hDir
Fe(A) = 2 3 = -1
Fe(C) = 2 1 = 1
AVL Fe(N) e {-1, 0, +1}; N
Fe()???
AVL
Fator de equilbrio dos ns
Fe(A) = 2 3 = -1
Fe(B) = 1 1 = 0
Fe(C) = 2 1 = 1
Fe(D) = 0 0 = 0
Fe(E) = 0 0 = 0
Fe(F) = 1 1 = 0
Fe(G) = 0 0 = 0
Fe(H) = 0 0 = 0
Fe(I) = 0 0 = 0
AVL
Calcular o fator de equilbrio dos ns

AVL
Calcular o fator de equilbrio dos ns
Resposta
AVL
Vantagem da rvore balanceada:







Com base na tabela acima, se tivssemos 1.048.575 elementos, poderamos
armazen-los em uma rvore binria perfeitamente balanceada com 20
nveis. Em outras palavras, poderamos localizar um elemento qualquer
dentro dessa rvore com apenas 20 comparaes.
AVL
O que pode acontecer quando um novo n inserido numa rvore
balanceada ?
Dada uma raiz r com subrvores L (left) e R (right), e supondo que a insero deve
ser feita na sub-rvore da esquerda. Podemos distriguir 3 casos:

Se hL = hR, ento L e R ficam com alturas diferentes mas continuam balanceadas.
Se hL < hR, ento L e R ficam com alturas iguais e balanceamento foi melhorado.
Se hL > hR, ento L fica ainda maior e balanceamento foi violado.
Exemplo
Dada a rvore:
Inserir o n 9 ou 11
Inseridos normalmente
Inserir o n 3 5 ou 7
Requer rebalanceamento

AVL
Uma rvore AVL balanceada quando para cada n da
rvore, a diferena entre as alturas das suas sub-rvores (D
e E) no maior que 1.
Onde no inserir ns???
H->(dir|esq)
I->(dir|esq)
Nos dois casos
Fe(C) = 3-1= 2
Todas as outras
levam algum | Fe |
para alm de 1
Tente...
AVL
Inserindo em H ou I, dois casos
Em H: Fe(F) = 1, Fe(C) = 2, F(A) = -2
Em I: Fe(F) = -1, Fe(C) = 2, F(A) = - 2
Inserir e depois rotacionar visto ser
necessrio alguns ajustes, tal que:
Continue ABB
Continue balanceada

AVL
Rotao simples
Ocorre devido ao seu desbalanceamento, uma rotao
simples ocorre quando um n est desbalanceado e seu filho
estiver no mesmo sentido da inclinao, formando uma linha
reta.

Rotao dupla
Ocorre quando um n estiver desbalanceado e seu filho
estiver inclinado no sentido inverso ao pai, formando um
joelho.

AVL
Rebalanceamento mapeado em dois casos
Raz (2|-2) e filho (1|-1) com o mesmo sinal
Rotao simples do n com |Fe| = 2 na direo correta
Raz (2|-2) com um sinal e filho(-1|1) com outro
Rotao do n com |Fe| = 1 na direo correta
Rotao do n que tinha |Fe| = 2 na direo oposta
AVL
Rotao direita

Numa rvore binria basta empurrar o nodo N para baixo e para a direita. O
filho esquerda de N o substitui, e o filho direita do filho esquerda
vem a ser o novo filho esquerda de N. Segue pseudocdigo:

Seja Y o filho esquerda de X
Torne X o filho direita de Y
Torne o filho direita de Y o filho esquerda de X.

interessante observar que as rotaes duplas nada mais so que duas
rotaes simples seguidas, independentes se direita ou esquerda.



AVL
Rotao esquerda
Em uma rvore binria, basta empurrar o n N para baixo e para a
esquerda. O filho direita de N o substitui, e o filho esquerda do
filho direita vem a ser o novo filho direita de N. Segue
pseudocdigo:

Seja Y o filho direita de X
Torne X filho esquerda de Y
Torne o filho esquerda de Y o filho direita de X.
AVL
Exemplo Rotao Simples ( direita)
A altura da sub-rvoce de raiz 4 difere de mais de 1 unidade da de
chave 7.
Como a altura da sub-rvore esquerda de 6
difere de 2 em relao sua sub-rvore
direita, rotaciona-se em torno do 4.
AVL
Exemplo Rotao Simples (continuao)
Ento 4 passa a ser a nova raiz
A sub-rvore com raiz 6 vira filho direito de 4





5 passa a ser filho esquerdo de 6
Balanceada!
AVL Procedimentos
Rotao a esquerda ou direita
void roda_dir(ARVORE p)
{
ARVORE q, temp;
q = p->esq;
temp = q->dir;
q->dir = p;
p->esq = temp;
p = q;
}
8
4
2
3
6
10
p
q
temp
Raz (2|-2) e filho (1|-1) com o mesmo sinal
Rotao simples do n com |Fe| = 2 na direo correta
Fe(8) = 3-1 = 2 Fe(4)= 2-1 = 1
8
9
14
q
temp
12
temp
q
p
AVL Procedimentos
Rotao a esquerda ou direita
void roda_dir(ARVORE p)
{
ARVORE q, temp;
q = p->esq;
temp = q->dir;
q->dir = p;
p->esq = temp;
p = q;
}
8
4
2
3
6
10
p
q
temp
AVL Procedimentos
Rotao a esquerda ou direita
void roda_dir(ARVORE p)
{
ARVORE q, temp;
q = p->esq;
temp = q->dir;
q->dir = p;
p->esq = temp;
p = q;
}
8
4
2
3
6
10
p
q
temp
AVL Procedimentos
Rotao a esquerda ou direita
void roda_dir(ARVORE p)
{
ARVORE q, temp;
q = p->esq;
temp = q->dir;
q->dir = p;
p->esq = temp;
p = q;
}
8
4
2
3
6
10
p
q
temp
AVL Procedimentos
Rotao a esquerda ou direita
void roda_dir(ARVORE p)
{
ARVORE q, temp;
q = p->esq;
temp = q->dir;
q->dir = p;
p->esq = temp;
p = q;
}
8
4
2
3
6
10
p
AVL Procedimentos
Rotao a esquerda ou direita
A esquerda anlogo...
Tente!
AVL
Exemplo Rotao Simples ( esquerda)
A altura da sub-rvore de raiz 7 difere de mais de 1 unidade
da de chave 3.
AVL
Rebalanceamento mapeado em dois casos
Raz (2|-2) e filho (1|-1) com o mesmo sinal
Rotao simples do n com |Fe| = 2 na direo
correta
Raz (2|-2) com um sinal e filho(-1|1) com outro
Rotao do n com |Fe| = 1 na direo correta
Rotao do n que tinha |Fe| = 2 na direo oposta
AVL - Procedimentos
E a, o que fazer?
Rotacionar 4 para a esquerda
Rotacionar 8 para a
direita
8
4
2
6
10
5
Raz (2|-2) com um sinal e filho(-1|1) com outro
Rotao do n com |Fe| = 1 na direo
correta
Rotao do n que tinha |Fe| = 2 na direo
oposta
Fe(8) = 3 1 = 2 Fe(4) = 1 2 = -1
AVL - Procedimentos
E a, o que fazer?
Rotacionar 4 para a esquerda
Rotacionar 8 para a
direita
8
6
4
2
10
5
Raz (2|-2) com um sinal e filho(-1|1) com outro
Rotao do n com |Fe| = 1 na direo
correta
Rotao do n que tinha |Fe| = 2 na direo
oposta
Fe(8) = 3 1 = 2 Fe(4) = 1 2 = -1
AVL - Procedimentos
E a, o que fazer?
Rotacionar 4 para a esquerda
Rotacionar 8 para a
direita
8
6
4
2
10
5
AVL
Exemplo rotao dupla
Rotao dupla: Se um n estiver
desbalanceado e seu filho estiver
inclinado no sentido inverso ao pai.
Nesse caso faz-se duas rotaes
simples seguidas!
Seu filho, o 6, est no
sentido inverso do 7, seu pai.
AVL
Exemplo rotao dupla direita:

Rotao simples esquerda




Rotao simples direita
AVL
Exemplo rotao dupla direita:
5 ser a nova raiz da sub-rvore de raiz 7
Como a nova raiz passa a ser o 5, o n
3 passa a no ser mais filho de 7




Alm disso, as arestas de 4 e 6 com 5 so desfeitas
AVL
Exemplo rotao dupla direita (continuao):
As sub-rvores de raizes 3 e 7 se ligam a 5





4 se liga a 3 e 6 se liga a 7
Balanceada!
Exerccios 11
Balancear:

Exerccios 11
Inserir: 5 3 7 10 33 15 17 (pag 66)

Excluir: 3 17

Excluir: 10 (considerando a rvore inicial)
Exerccios 11
Na rvore AVL abaixo:
inserir 15, 7 e 28
Excluir 4 e 8

8
6
4
2
10
5
rvores B e B+
rvore B ou B-Tree
um tipo de rvore muito utilizada em banco de dados e sistema de arquivos.
Para inserir ou remover variveis de um n, o n no poder ultrapassar sua ordem e nem
ser menor que sua ordem dividida por dois.
rvores B no precisam ser rebalanceadas como so freqentemente as rvores de busca
binria com rvore AVL.
rvores B tm vantagens substanciais em relao a outros tipos de implementaes quanto
ao tempo de acesso e pesquisa aos ns.
O criador das rvores B, Rudolf Bayer, no definiu claramente de onde veio o B das rvores
B.
Ao que parece, o B vem de balanceamento onde todos os ns da rvore esto em um mesmo
nvel.
Tambm possvel que o B tenha vindo de seu sobrenome Bayer, ou ainda do nome da
empresa onde trabalhava Boeing, no Boeing Scientific Research Labs.
Estrutura do N
Ns em rvores B, geralmente so representados por um conjunto de
elementos apontando para seus filhos.
Alguns autores consideram a ordem de uma rvore B como sendo a quantidade
de registros que a pgina pode suportar.
Outros consideram a ordem como a quantidade de campos apontadores.
Todo n da rvore tem um mnimo de elementos definido pela sua ordem, que
a metade da ordem, arredondando-se para baixo, caso a rvore seja de ordem
mpar, exceto a raiz da rvore, que pode ter um mnimo de um registro.
Por exemplo, os ns de uma rvore de ordem 5, devem ter, no mnimo 5 / 2
registros, ou seja, dois registros.
A quantidade de filhos que um n pode ter sempre a quantidade de registros
do n mais 1 (V+1).
Por exemplo, se um n tem 4 registros, este n ter obrigatoriamente 5
apontamentos para os ns filhos.
Insero
Primeiro, pesquise a posio onde este n ser includo. Ento, insira
o valor dentro do n.
Se nenhum n ficou errado, acima ou abaixo da ordem div 2, o
processo terminado.
Se algum n ficar acima da ordem, dividimos o n, o valor central do
n dividido sobe para a posio do pai, continuando assim
recursivamente por toda a rvore.
Se o n estourar na raiz, ento criado um novo n raiz
((podendo ter um nico elemento)).

Excluso
Primeiro, busque um valor a ser excludo. Ento, remova-o de dentro de um n.
Se nenhum n teve problema, o processo terminado.
Se algum n estiver errado, ento h duas possibilidades:
Se o n ao lado do n errado pode transferir um ou mais de seus ns
filho ao n atual, ento o n atual voltar ao normal. Aps ter
atualizado os valores da separao do pai e dos dois filhos, o
processo terminado.
Se o n ao lado do n errado no tem um filho extra porque est no
limite mais baixo, ento ambos os ns sero fundidos em um nico
n. Continuando at que o n atual esteja normal.

Exerccios 12
Na rvore B da figura:
Inserir 5 e 6 na rvore da figura



Remover 2 e 3.
rvores-B
Objetivo principal
Minimizar o nmero de acessos ao disco para recuperar um registro
25
10 20 30 40
2 5 7 8
13 14 15 18
22 24 26 27 28
32 35 38
41 42 45 46
rvores-B
Devido a organizao, altura da rvore
log
m
N
Ordem da rvore-B: m
Nmero de chaves: N
Altura da rvore AVL melhor caso
Aplicaes
Sistema de arquivos: ponteiros para clusters
rvores-B
Como representar em C?
#define ORDEM 2
#define TAMANHO (ORDEM*2)-1

typedef struct Pagina *PonteiroPagina;
typedef struct {
int chave;
PonteiroPagina p;
} item;

typedef struct {
int m; // numero de itens na pagina
PonteiroPagina p0;
item e[TAMANHO];
} Pagina;
Busca em rvores-B
Busca binria na pgina atual
No encontrando
K
i
< x < K
i+1
com 1 s i < m
Continuar a busca na pgina p
i
Km < x
Continuar a busca na pgina p
m
x < K
1
Continuar a busca na pgina p
0
Pgina atual == NULL no existe
Busca em rvores-B
Implemente uma funo de busca em rvore-B com o
prottipo
Int Pesquisa (int, PonteiroPagina, int *)
Busca em rvore-B
Possvel implementao
int Pesquisa(int x, PonteiroPagina pag, int *achou) {
int i;
*achou = 0
if (pag == NULL) return 0;
i = 1;
while ((i <= TAMANHO) && (x > pag->e[i-1].chave))
i++;
if (x == pag->e[i-1].chave) {
*achou = 1;
return x;
} else
if (x < pag->e[i-1].chave)
Pesquisa (x, pag->e[i-1].p, achou);
else
Pesquisa (x, pag->e[i].p, achou);
}
Insero em rvores-B
A criao de uma rvore-B trivial
Inserir que o problema...
Respeitar as limitaes de ocupao dos ns no-raiz (entre m e 2m)!
Crescimento das folhas para a raz
Se folhas no acomodarem, aumentar a altura da rvore e manter
folhas no mesmo nvel
Insero em rvores-B
Considerar uma rvore-B ordem 2
Inserir as chaves abaixo na ordem dada
20, 40, 10, 30, 15, 35, 7, 26, 18, 22
Insero em rvores-B
Inserir as chaves abaixo na ordem dada
20, 40, 10, 30, 15, 35, 7, 26, 18, 22
20
Insero em rvores-B
Inserir as chaves abaixo na ordem dada
20, 40, 10, 30, 15, 35, 7, 26, 18, 22
20 40
Insero em rvores-B
Inserir as chaves abaixo na ordem dada
20, 40, 10, 30, 15, 35, 7, 26, 18, 22
10 20 40
Insero em rvores-B
Inserir as chaves abaixo na ordem dada
20, 40, 10, 30, 15, 35, 7, 26, 18, 22
10 20 30 40
15
10, 15, 20, 30, 40 Mediana promovida
Insero em rvores-B
Inserir as chaves abaixo na ordem dada
20, 40, 10, 30, 15, 35, 7, 26, 18, 22
20
10 15 30 40
Insero em rvores-B
Inserir as chaves abaixo na ordem dada
20, 40, 10, 30, 15, 35, 7, 26, 18, 22
20
10 15 30 35 40
Insero em rvores-B
Inserir as chaves abaixo na ordem dada
20, 40, 10, 30, 15, 35, 7, 26, 18, 22
20
7 10 15 30 35 40
Insero em rvores-B
Inserir as chaves abaixo na ordem dada
20, 40, 10, 30, 15, 35, 7, 26, 18, 22
20
7 10 15 26 30 35 40
Insero em rvores-B
Inserir as chaves abaixo na ordem dada
20, 40, 10, 30, 15, 35, 7, 26, 18, 22
20
7 10 18 15 26 30 35 40
22
22, 26, 30, 35, 40 Mediana promovida
Insero em rvores-B
Inserir as chaves abaixo na ordem dada
20, 40, 10, 30, 15, 35, 7, 26, 18, 22






20 30
7 10 15 18 22 26 35 40
Exerccios 13
Na rvore anterior, continuar inserindo chaves
5, 42, 13, 46, 27, 8, 32, 38, 24, 45, 25
Cuidado com as divises de pgina!

Remoo em rvores-B
Algumas situaes podem ocorrer
Chave na pgina folha
Remover se no violar condies
Chave em pgina intermediria
Trocar a chave pelo seu sucessor in-ordem da D E (maior chave
menor que a chave) em uma pgina folha e remova a chave na folha
Se ocorrer violao (pgina com menos de m chaves), ajustar
Balancear (pgina vizinha)
Intercalao (acaba removendo uma pgina)
Remoo em rvores-B
Algumas situaes podem ocorrer
Ajuste de violao
Troca com intercalao direita
Troca com intercalao esquerda
Balanceamento direita/esquerda se nmero de chaves das pginas
mais pai > 2m+1
Intercalao com direita/esquerda, se nmero de chaves das pginas
mais pai s 2m
Remoo em rvores-B
Eliminar chave 24
22 34
6 11 14 19 24 26 38 42 46
5 > 2m+1 Balanceamento
26, 34, 38, 42, 46 Promove mediana!
Remoo em rvores-B
Eliminar chave 24





E para eliminar 26???
22 38
6 11 14 19 26 34 42 46
4 s 2m Intercalao
Remoo em rvores-B
Eliminar chave 26





E para eliminar 22???
22
6 11 14 19 34 38 42 46
Exerccio 14
Considerando inseridas todas as chaves da rvore B do exerccio
anterior, mostrar as arvores intermedirias das excluses de 20,
25, 38 e 40.
rvore B+
Uma rvore B+ uma variao da rvore B.
Representa a ordenao de dados de uma maneira que permita uma insero e
remoo eficiente de elementos.
um ndice dinmico de multi-nveis com ligaes mximas e mnimas no nmero de
chaves em cada nodo.
Os sistemas de arquivos NTFS para o Microsoft Windows, o sistema de arquivos
ReiserFS para Unix, o XFS para IRIX e Linux, e o JFS2 para AIX, OS/2 e Linux, usam
este tipo de rvore.
Numa rvore-B+, contrastando com uma rvore-B, todos dos dados so gravados nas
folhas.
Os nodos internos contm apenas chaves e apontadores da rvore. Todas as folhas
esto no mesmo nvel mais baixo. Os nodos das folhas tambm esto ligados entre si
como uma lista para efetuar consultas facilmente.
Conceitos
O nmero mximo de apontadores num registro chamado de ordem da rvore B+.
O nmero mnimo de chaves por registro metade do nmero mximo de chaves.
Por exemplo:
Se a ordem de uma rvore B+ for n+1, cada nodo (exceto o da raiz) dever ter
entre (n+1)/2 e n chaves.
Se n for um nmero primo, o nmero mnimo de chaves pode ser (n+1)/2 ou
(n-1)/2, mas ter de ser o mesmo em toda a rvore.
Um exemplo simples de uma rvore B+
ligando as chaves 1-7 aos valores de dados
d1-d7.
Notar a lista ligada (em vermelho) permitindo
uma atualizao ordenada rpida.
Conceitos
O nmero de chaves que poder ser indexado ao usar a rvore B+ uma funo da
ordem da rvore e da sua altura.
Para uma rvore B+ de ordem n com uma altura h:
O nmero mximo de nodos nh
O nmero mnimo de chaves 2(n / 2)h 1.

A rvore B+ foi descrita pela primeira vez em "Rudolf Bayer, Edward M. McCreight:
Organization and Maintenance of Large Ordered Indices. Acta Informatica 1: 173-189
(1972)".

Uma extenso de uma rvore B+ chamada de rvore B# que usa a estrutura da
rvore B+ e adiciona mais restries.
Exerccios 15
1. Inserir as chaves abaixo em uma rvore B+ na ordem
dada
20, 40, 10, 30, 15, 35, 7
2. Excluir 30 e 15

Variantes de rvores-B
rvores-B*
Todas as chaves esto nas folhas, e ns intermedirios so, apenas,
ndices
Folhas encadeadas para permitir acesso seqencial
Usada em bancos de dados para aumentar a concorrncia
Insero em pgina segura com at 2m registros
Remoo em pginas seguras com pelo menos m registros

rvores Rubro-Negras
um tipo de rvore criada em 1972 com o nome de rvores
binrias simtricas.
Assim como as rvores binrias comuns, as rvores rubro-negras
possuem um conjunto de operaes (tais como insero, remoo
e busca), porm so geralmente mais eficientes devido ao fato de
estarem sempre balanceadas.
Este balanceamento se d justamente pela caracterstica que d
nome rvore, que vem de um bit extra em cada n que
determina se este "vermelho" ou "preto" dentro do conjunto de
regras que rege a rvore.
Alm deste bit, cada n tambm conta com os campos dados do
n, filho esquerdo do n, filho direito do n e pai do n.
Definio do n
struct node *
grandparent(struct node *n)
{
if ((n != NULL) && (n->parent != NULL))
return n->parent->parent;
else
return NULL;
}

struct node *
uncle(struct node *n)
{
struct node *g = grandparent(n);
if (g == NULL)
return NULL; // No grandparent means no uncle
if (n->parent == g->left)
return g->right;
else
return g->left;
}

Regras
Uma rvore rubro-negra estar sempre balanceada pois
segue o seguinte conjunto de regras:
cada n da rvore possui um valor
a cada novo n inserido na rvore obedecer o
esquema de menor para o lado esquerdo e maior
para o lado direito.
a cada n associada uma cor: vermelha ou preta.
o n raiz sempre preto.
ns vermelhos que no sejam folhas possuem
apenas filhos pretos.
para cada n, todos os caminhos do n at qualquer
folha passa pelo mesmo nmero de ns pretos.

Regras - Insero
A cada vez que uma operao realizada na rvore,
testa-se o conjunto de propriedades descritos
anteriormente e so efetuadas rotaes e ajuste de
cores at que a rvore satisfaa todas estas regras.
Uma rotao uma operao realizada na rvore para
garantir seu balanceamento. Na rubro-negra pode ser
feita a direita e a esquerda, onde so alterados os
ponteiros dos ns rotacionados.
Ao inserir um elemento em uma rvore rubro-negra,
esta comparada com os elementos e alocada em sua
posio conforme a regra 2. Ao inserir um elemento ele
sempre da cor vermelha (exceto se for o nodo raiz). A
seguir a rvore analisa o antecessor da folha. Se este
for vermelho ser necessrio alterar as cores para
garantir a regra 5.
Regras - Inserir
Existem trs casos para corrigir as cores aps uma
insero:
Caso 1: O tio do elemento inserido VERMELHO.
Caso 2: O tio do elemento inserido PRETO e o elemento
inserido um filho da direita.
Caso 3: O tio do elemento inserido PRETO e o elemento
inserido um filho da esquerda.
O n raiz
Ao inserir o primeiro n na rvore (raiz) este ser preto.
void
insert_case1(struct node *n)
{
if (n->parent == NULL)
n->color = BLACK;
else
insert_case2(n);
}

Insero caso 2
void
insert_case2(struct node *n)
{
if (n->parent->color == BLACK)
return; /* Tree is still valid */
else
insert_case3(n);
}

Insero caso 3
void
insert_case3(struct node *n)
{
struct node *u = uncle(n), *g;

if ((u != NULL) && (u->color == RED)) {
n->parent->color = BLACK;
u->color = BLACK;
g = grandparent(n);
g->color = RED;
insert_case1(g);
} else {
insert_case4(n);
}
}

Insero caso 4
void
insert_case4(struct node *n)
{
struct node *g = grandparent(n);

if ((n == n->parent->right) && (n->parent == g->left)) {
rotate_left(n->parent);
n = n->left;
} else if ((n == n->parent->left) && (n->parent == g->right)) {
rotate_right(n->parent);
n = n->right;
}
insert_case5(n);
}

Insero caso 5
void
insert_case5(struct node *n)
{
struct node *g = grandparent(n);

n->parent->color = BLACK;
g->color = RED;
if ((n == n->parent->left) && (n->parent == g->left)) {
rotate_right(g);
} else {
/*
* Here, (n == n->parent->right) && (n->parent == g->right).
*/
rotate_left(g);
}
}

Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
O n raiz sempre preto!
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Na insero o n de menor valor vai para o lado esquerdo e o de
maior para o lado direito.
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Ao inserir um elemento ele sempre da cor vermelha, exceto o
n raiz.
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Na insero o n de menor valor vai para o lado esquerdo e o de
maior para o lado direito.
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Na insero o n de menor valor vai para o lado esquerdo e o de
maior para o lado direito.
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Aps inserir um elemento da cor vermelha, a rvore analisa o
antecessor da folha. Se este for vermelho ser necessrio alterar as
cores para garantir a regra 6 (ns vermelhos que no sejam folhas
possuem apenas filhos pretos).
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
14 o irmo de 2 e vermelho.
O preto pode ser transferido do pai a seus dois filhos vermelhos (o
pai, em seguida, toma a cor vermelha), sem afetar a contagem do
nodo preto por qualquer caminho.
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Desde que o pai 11 a raiz, o processo pode ser interrompido
neste ponto porque...
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
A raiz sempre deve ser preta, sem afetar a contagem de nodos
pretos em qualquer caminho.

Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
O irmo 1 de 7 vermelho, deve-se puxar o preto do 2 para baixo.
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
O preto pode ser transferido de um pai de seus dois filhos vermelhos
(o pai, em seguida, toma a cor vermelha), sem afetar o numero de
nodos pretos de qualquer caminho. No entanto, uma dupla violao
vermelha poder ser resultante dessa mudana.
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 11,2,14,1,7,13,15,5,8
Exemplo
Inserir 4
Exemplo
Inserir 4
Exemplo
Inserir 4
Exemplo
Inserir 4
Exemplo
Inserir 4
O irmo 8 do 5 vermelho, puxar o preto para baixo a partir de 7 do
conjunto atual de 2
Exemplo
Inserir 4
O preto pode ser transferido de um pai para seus dois filhos vermelhos (o
pai, em seguida, toma a cor vermelha), sem afetar a contagem do
caminho do nodo preto. No entanto, uma dupla violao vermelha poder
ocorrer. Portanto, definir 2 para a raiz da sub-rvore.
Exemplo
Inserir 4
O pai 11 de 2 do lado direito e seu filho 7 vermelho e est
direita: girar no sentido anti-horrio em torno de 2, fixando no 7
Exemplo
Inserir 4
Desde que 11 pai direita de 2, se o filho vermelho 7 ficou a esquerda,
pode-se girar o 11 preto e ento mudar de volta para eliminar a dupla
violao vermelha (isto explicado com mais detalhes no Prximo
passo).
Exemplo
Inserir 4
Ento, ns usamos este passo para configurar essa possibilidade por
rotao no sentido anti-horrio em torno de 2.
O resultado vermelho 7 esquerda de 11 e vermelho preto 2,
esquerda do vermelho 7.
Exemplo
Inserir 4
O pai 11, de 7 est do lado direito e seu filho 2 vermelho
esquerda: girar no sentido horrio em torno de 11
Exemplo
Inserir 4
Desde que 11 preto pai, direita do vermelho 7 e vermelho 2 filho e
est sua esquerda, uma rotao no sentido horrio por 11 vai subtrair
um negro do caminho atravs da 2. Mas este desequilbrio pode ser
corrigido por troca de cores, de 11 e 7.

Exemplo
Inserir 4
Ao faz-lo (na prxima etapa), tambm elimina a dupla violao
vermelha.
Exemplo
Inserir 4
Mudana de cores.
O 2 filho vermelho esquerda de 7 tem um n preto contar que
muito baixo por 1. Trocando as cores entre os atuais e seu filho negro
direita (11) elimina a conta do dficit e da dupla violao vermelho. O
nodo preto direita do filho atual no afetado.
Exemplo
Inserir 4
Regras - Remoo
Existem dois tipos de remoo em uma rvore:
De acordo com a remoo efetiva, com as operaes de
rotao e alterao de cor, remove-se o nodo e
estabelece-se as propriedades da rvore.
De acordo com a remoo preguiosa, marca-se um
nodo como removido, mas efetivamente no o retira.
Sendo desta maneira nenhuma alterao efetuada na
rvore, porm so necessrios novos mecanismos de
busca e insero para que reconheam o nodo como
"ausente".
Exerccio 16
Excluir 7

Você também pode gostar