You are on page 1of 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 bibliogrca

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 nito de rvores do tipo T associadas, chamdadas as sub-rvores da raiz.
A d d d d B D C d d d d E F H G d J I 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 signicante. Assim, as duas rvores ordenadas seguintes so diferentes.
A

d d d d
C A

d d d d
D

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, lho, nvel


A

d d d d
C

E I

d d
J

G L

d d

Pai e lho: Um n y abaixo de um n x chamado lho 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 lhos 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

d d d d
C

E I

d d
J

G L

d d

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 lhos. 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 lhos 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

d d d d
C

E I

d d
J

G L

d d

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

Usando a nomenclatura vista, podemos denir 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 * d d d d + d d e f
Pode representar a expresso aritmtica:

/ d d + d d a b c d

((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 Articial: rvores que representam o espao de solues, e.g. jogo de xadrez, resoluo de problemas, etc. No processamento de cadeias de caracteres: rvore de suxos. 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 denida recursivamente assim:
1 2

Aloque um n para ser a raiz. Coloque na esquerda da raiz uma rvore gereada por tree(nl = n div 2). 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

d d d d

n=3

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

rvores e rvores Binrias

rvore perfeitamente balanceada com n = 4

d d d n=4 d

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

rvores e rvores Binrias

rvore perfeitamente balanceada com n = 5

d d d d n=5

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

rvores e rvores Binrias

rvore perfeitamente balanceada com n = 6

d d d d d d n=6

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

rvores e rvores Binrias

rvore perfeitamente balanceada com n = 7

d d d d d n=7 d d d

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 2 3

Vistar a raiz. Percorrer a sua subrvore esquerda em pr-ordem. Percorrer a sua subrvore direita em pr-ordem.

Visitar um n signica 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 2 3

Vistar a raiz. Percorrer a sua subrvore esquerda em pr-ordem. Percorrer a sua subrvore direita em pr-ordem.

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

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-rst).
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 2 3

Vistar a raiz. Percorrer a sua subrvore esquerda em pr-ordem. Percorrer a sua subrvore direita em pr-ordem.

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

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-rst).
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 = 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 2 3

Percorrer a sua subrvore esquerda em in-ordem. Vistar a raiz. 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 2 3

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

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

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 = 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 signica 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 2 3

Percorrer a sua subrvore direita em in-ordem. Vistar a raiz. Percorrer a sua subrvore esquerda em in-ordem. A rvore impressa: A C

d
B D

d d d
E B D C

d 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 = 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 = nil or pilha no vazia do 3: if p = 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 2 3

Percorrer a sua subrvore esquerda em ps-ordem. Percorrer a sua subrvore direita em ps-ordem. 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 2 3

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

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

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 2 3

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

Exemplo

* d d d d + d d e f

/ d d + d d a b c d

Percurso em ps-ordem: a b + c d / e f +

A representao de uma expresso aritmtica com o operador no nal 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 2 3

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

Exemplo

* d d d d + d d e f

/ d d + d d a b c d

Percurso em ps-ordem: a b + c d / e f +

A representao de uma expresso aritmtica com o operador no nal 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 = 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-rst): percorre a rvore em ordem crescente de seus nveis e, em cada nvel, da esquerda para a direita. Uma la usada para realizar este percurso.
A d d d B D d C d d E F d d I G H

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 denidos. Escreva uma algoritmo para denir o
Siang Wun Song - Universidade de So Paulo - IME/USP rvores e rvores Binrias