Você está na página 1de 37

rvores e rvores Binrias

Siang Wun Song - Universidade de So Paulo - IME/USP

MAC 5710 - Estruturas de Dados - 2008

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Referncia bibliogrfica

Os slides sobre este assunto so parcialmente baseados nas


sees sobre rvores do captulo 4 do livro
N. Wirth. Algorithms + Data Structures = Programs.
Prentice Hall, 1976.

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


rvore

Uma rvore do tipo T constituda de


uma estrutura vazia, ou
um elemento ou um n do tipo T chamado raiz com um
nmero finito de rvores do tipo T associadas, chamdadas
as sub-rvores da raiz.

A
@
@
@
@
B C D
@ @
@ @
E F G H
@
I J K L

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Nomenclatura: rvore ordenada
Uma rvore chamada ordenada quando a ordem das
subrvores significante. Assim, as duas rvores ordenadas
seguintes so diferentes.
A
@
@
@@
B C D

A
@
@
@@
C D B

Numa rvore que representa os descendentes de uma


famlia real, a ordem das subrvores pode ser importante
pois pode determinar a ordem de sucesso da coroa.

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Nomenclatura: pai, filho, nvel
A
@
@
@
@
B C D
@ @
@ @
E F G H
@
I J K L

Pai e filho: Um n y abaixo de um n x chamado filho de x. x


dito pai de y . Exemplo: B pai de E e F.
Irmo: Ns com o mesmo pai so ditos irmos. Exemplo: B, C,
D so irmos.
Nvel de um n: A raiz de uma rvore tem nvel 1. Se um n tem
nvel i, seus filhos tm nvel i + 1. Exemplo: E, F, G e H tm
nvel 3.
Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias
Nomenclatura: altura, folha, grau
A
@
@
@
@
B C D
@ @
@ @
E F G H
@
I J K L

Altura ou profundidade de uma rvore: o mximo nvel de


seus ns. A rvore do exemplo tem altura 4.
Folha ou n terminal: um n que no tem filhos. Exemplo: I, J,
K, L so folhas.
N interno ou n no terminal: um n que no folha.
Grau de um n: o nmero de filhos do n. Exemplo: B tem
grau 2, G tem grau 1.
Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias
Nomenclatura: grau de rvore, rvore binria

A
@
@
@
@
B C D
@ @
@ @
E F G H
@
I J K L

Grau de uma rvore: o mximo grau de seus ns. A rvore do


exemplo tem grau 3.

Usando a nomenclatura vista, podemos definir a rvore binria.


rvore binria: uma rvore ordenada de grau 2.

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


rvore binria
Uma rvore binria
vazia ou
um n chamado raiz mais duas rvores binrias disjuntas
chamadas subrvore esquerda e subrvore direita.

Exemplo *
@
@
@
@
/ +
@ @
@ @
+ - e f
@ @
a b c d Pode representar a expresso aritmtica:

((a + b) /(c d)) (e + f )


Veja como a estrutura de rvore binria expressa de maneira clara a
precedncia das operaes, sem necessidade de usar parntesis.
Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias
Aplicaes que usam rvores e rvore binrias
Problemas de busca de dados armazenados na memria
principal do computador: rvore binria de busca, rvores
(quase) balanceadas como AVL, rubro-negra, etc.
Problemas de busca de dados armazenados na memria
secundrias principal do computador (disco rgico): e.g.
B-rvores.
Aplicaes em Inteligncia Artificial: rvores que
representam o espao de solues, e.g. jogo de xadrez,
resoluo de problemas, etc.
No processamento de cadeias de caracteres: rvore de
sufixos.
Na gramtica formal: rvore de anlise sinttica.
Em problemas onde a meta achar uma ordem que
satisfaz certas restries (e.g. testar a propriedade de
uns-consecutivos numa matriz, reconhecer grafos
intervalo, planaridade de grafo, etc.): rvore-PQ.
Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias
Implementao de uma rvore binria

Em Pascal podemos declarar o registro node assim:

type node = record


key: integer;
left, right: node
end

Vamos fazer um pequeno exerccio: construir uma rvore binria


constituda de n ns, para um dado n, que tenha mnima altura.
Para isso, vamos alocar o mximo numero possvel de ns em cada
nvel da rvore, exceto no ltimo que pode estar incompleto.
Podemos distribuir ns em igual quantidade para a esquerda e a
direita de cada n. Teremos uma rvore perfeitamente balanceada.

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Construo de uma rvore perfeitamente balanceada

rvore perfeitamente balanceada: para todo n da rvore, os


nmeros de ns das suas duas subrvores diferem no mximo
em um.
Seja a funo tree(n) que gera uma rvore perfeitamente
balanceada com n ns.
Informalmente tree(n) pode ser definida recursivamente assim:
1 Aloque um n para ser a raiz.
2 Coloque na esquerda da raiz uma rvore gereada por
tree(nl = n div 2).
3 Coloque na direita da raiz uma rvore gereada por
tree(nr = n nl 1).
Veremos exemplos de rvores assim construdas.

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


rvore perfeitamente balanceada com n = 1

n=1

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


rvore perfeitamente balanceada com n = 2

n=2

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


rvore perfeitamente balanceada com n = 3

@
@
@
@

n=3

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


rvore perfeitamente balanceada com n = 4

@
@
@
@

n=4

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


rvore perfeitamente balanceada com n = 5

@
@
@
@

n=5

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


rvore perfeitamente balanceada com n = 6

@
@
@
@
@
@

n=6

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


rvore perfeitamente balanceada com n = 7

@
@
@
@
@ @
@ @

n=7

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Progama em Pascal - livro de N. Wirth

type ref = node;


node = record
key: integer;
left, right: ref
end;
var n: integer; root: ref;
function tree(n: integer): ref;
var newnode: ref;
x, nl, nr: integer;
begin { constri uma rvore perf. balanceada de n ns}
if n = 0 then
tree:=nil
else
begin
nl:= n div 2;
nr:= n - nl - 1;
read(x);
new(newnode);
begin
newnode.key:=x;
newnode.left:=tree(nl);
newnode.right:=tree(nr)
end;
tree:=newnode
end
end

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Formas de percorrer uma rvore

Em algumas aplicaes, necessrio percorrer uma rvore de


forma sistemtica, visitando cada n da rvore uma nica vez,
em determinada ordem.
Por exemplo, se cada n da rvore possui um campo que
armazena o salrio, ento podemos querer visitar cada n para
fazer um reajuste salarial. A visita seria atualizar o campo
salrio. No podemos esquecer nenhum n, nem queremos
visitar um n mais do que uma vez. Neste caso, a ordem de
visita no importante. Mas em algumas outras aplicaes,
queremos visitar os ns em certa ordem desejada.
Veremos vrias formas para percorrer uma rvore binria.
Pr-ordem.
In-ordem ou ordem simtrica.
Ps-ordem.

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Percorrer uma rvore binria em pr-ordem

Percorrer uma rvore binria em pr-ordem:


1 Vistar a raiz.
2 Percorrer a sua subrvore esquerda em pr-ordem.
3 Percorrer a sua subrvore direita em pr-ordem.
Visitar um n significa executar uma certa ao no n.

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Exemplo de percurso em pr-ordem
Percorrer uma rvore binria em pr-ordem:
1 Vistar a raiz.
2 Percorrer a sua subrvore esquerda em pr-ordem.
3 Percorrer a sua subrvore direita em pr-ordem.

A
@
@
@
@
B C
@
@
D E F
@ @
G H I

Percurso em pr-ordem: A B D C E G F H I
O percurso em pr-ordem segue os ns at chegar os mais profundos, em ramos
de subrvores da esquerda para a direita. conhecida usualmente pelo nome de
percurso em profundidade (depth-first).
Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias
Exemplo de percurso em pr-ordem
Percorrer uma rvore binria em pr-ordem:
1 Vistar a raiz.
2 Percorrer a sua subrvore esquerda em pr-ordem.
3 Percorrer a sua subrvore direita em pr-ordem.

A
@
@
@
@
B C
@
@
D E F
@ @
G H I

Percurso em pr-ordem: A B D C E G F H I
O percurso em pr-ordem segue os ns at chegar os mais profundos, em ramos
de subrvores da esquerda para a direita. conhecida usualmente pelo nome de
percurso em profundidade (depth-first).
Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias
Procedimento pre-order em Pascal
fcil escrever um procedimento recursivo para realizar a
pr-ordem. Em Pascal:

type ref = node;


node = record
key: integer;
left, right: ref
end;
procedure pre-order(t: ref);
begin
if t 6= nil then
begin
visita(t);
pre-order(t.left);
pre-order(t.right);
end
end

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Percorrer uma rvore binria em in-ordem

Percorrer uma rvore binria em in-ordem:


1 Percorrer a sua subrvore esquerda em in-ordem.
2 Vistar a raiz.
3 Percorrer a sua subrvore direita em in-ordem.
A in-ordem visita a raiz entre as aes de percorrer as duas
subrvores. conhecida tambm pelo nome de ordem
simtrica.

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Exemplo de percurso em in-ordem

Percorrer uma rvore binria em in-ordem:


1 Percorrer a sua subrvore esquerda em in-ordem.
2 Vistar a raiz.
3 Percorrer a sua subrvore direita em in-ordem.

A
@
@
@
@
B C
@
@
D E F
@ @
G H I

Percurso em in-ordem: D B A E G C H F I

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Procedimento in-order em Pascal
fcil escrever um procedimento recursivo para realizar a
in-ordem. Em Pascal:

type ref = node;


node = record
key: integer;
left, right: ref
end;
procedure in-order(t: ref);
begin
if t 6= nil then
begin
in-order(t.left);
visita(t);
in-order(t.right);
end
end

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Exemplo de percurso em in-ordem
Queremos imprimir os ns de uma rvore binria apontada por t em
uma impressora do tipo matricial, em que cada linha impressa de
cada vez. A visita de um n significa imprimi-lo pela impressora.

A ordem de visita dos ns quase a in-ordem, que chamaremos de


in-ordem, com a simples inverso na ordem de percurso das duas
subrvores:
Percorrer uma rvore binria em in-ordem:
1 Percorrer a sua subrvore direita em in-ordem.
2 Vistar a raiz.
3 Percorrer a sua subrvore esquerda em in-ordem.

A rvore impressa: C
@ A
@
@
@ E
B C
@ B
@
D E D

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Procedimento de impresso em Pascal
O livro de Wirth apresenta o seguinte procedimento para imprimir
uma rvore binria. Note a sua semelhana com a in-ordem,
trocando-se apenas left com right.

type ref = node;


node = record
key: integer;
left, right: ref
end;
procedure print-tree(t: ref; h: integer);
var i: integer;
begin {imprime rvore t com indentao h}
if t 6= nil then
begin
print-tree(t.right, h+1);
for i:= 1 to h do write( );
writeln(t.key);
print-tree(t.left, h+1);
end
end

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Percorrer em in-ordem sem usar recurso
A recurso facilita a escrita do algoritmo de percurso, mas podemos
fazer o percurso, digamos em in-ordem, sem usar recurso.
Para isso usamos uma pilha. Suponhamos que j existem as rotinas
push e pop. O apontador t aponta para a rvore binria a ser
percorrida.
in-order(t):
1: p t
2: while p 6= nil or pilha no vazia do
3: if p 6= nil then
4: push(p)
5: p left(p)
6: else
7: pop(p)
8: visita(p)
9: p right(p)
10: end if
11: end while

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Percorrer uma rvore binria em ps-ordem

Percorrer uma rvore binria em ps-ordem:


1 Percorrer a sua subrvore esquerda em ps-ordem.
2 Percorrer a sua subrvore direita em ps-ordem.
3 Vistar a raiz.

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Exemplo de percurso em ps-ordem

Percorrer uma rvore binria em ps-ordem:


1 Percorrer a sua subrvore esquerda em ps-ordem.
2 Percorrer a sua subrvore direita em ps-ordem.
3 Vistar a raiz.

A
@
@
@
@
B C
@
@
D E F
@ @
G H I

Percurso em ps-ordem: D B G E H I F C A

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Outro exemplo de percurso em ps-ordem
Percorrer uma rvore binria em ps-ordem:
1 Percorrer a sua subrvore esquerda em ps-ordem.
2 Percorrer a sua subrvore direita em ps-ordem.
3 Vistar a raiz.

Exemplo *
@
@
@
@
/ +
@ @
@ @
+ - e f
@ @
a b c d

Percurso em ps-ordem: a b + c d / e f +
A representao de uma expresso aritmtica com o operador
no final dos operandos conhecida pelo nome de notao
reversa ou polonesa.
Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias
Outro exemplo de percurso em ps-ordem
Percorrer uma rvore binria em ps-ordem:
1 Percorrer a sua subrvore esquerda em ps-ordem.
2 Percorrer a sua subrvore direita em ps-ordem.
3 Vistar a raiz.

Exemplo *
@
@
@
@
/ +
@ @
@ @
+ - e f
@ @
a b c d

Percurso em ps-ordem: a b + c d / e f +
A representao de uma expresso aritmtica com o operador
no final dos operandos conhecida pelo nome de notao
reversa ou polonesa.
Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias
Procedimento post-order em Pascal
fcil escrever um procedimento recursivo para realizar a
ps-ordem. Em Pascal:

type ref = node;


node = record
key: integer;
left, right: ref
end;
procedure post-order(t: ref);
begin
if t 6= nil then
begin
post-order(t.left);
post-order(t.right);
visita(t);
end
end

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Percurso em largura
H ainda outras formas usuais para percorrer uma rvore.
Percurso em largura ou em nvel (breadth-first): percorre a
rvore em ordem crescente de seus nveis e, em cada nvel, da
esquerda para a direita. Uma fila usada para realizar este
percurso.
A
@
@
@
@
B C
@
@
D E F
@ @
G H I

Percurso em largura: A B C D E F G H I

Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias


Aplicaes que usam percurso de rvores
H vrias aplicaes que se baseiam em percurso de rvores.
Adota-se uma ordem apropriada de percurso.
Usa-se uma rotina adequada para visitar cada n.
Exerccios:
1 Considere uma rvore binria dada onde cada n tem um
campo adicional chamado alt. Escreva um algoritmo que
coloque no campo alt de cada n x da rvore binria a
altura da subrvore enraizada em x. Dica: use ps-ordem
e uma rotina apropriada de visita. Tente fazer este
exerccio e veja o por que da adoo da ps-ordem.
2 Em algumas situaes, desejvel ter um campo
adicional pai em cada n da rvore que aponta para o n
pai. No caso de raiz, o seu campo pai deve apontar para
nil.
Suponha uma rvore binria existente que reservou este
campo pai em cada n mas apenas os campos key , left e
right esto definidos. Escreva uma algoritmo para definir o
Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias

Você também pode gostar