Professional Documents
Culture Documents
rvore Binria uma rvore onde cada n pode conter nenhum, 1 ou 2 filhos apenas
Grau=2.
Uma rvore binria formada por ns onde cada n contm um valor, um ponteiro esquerdo e um ponteiro direito.
A B C
G
Nivelamento - PIPCA 2012/1 2
rvore Binria O n A a raiz da rvore. Como B a raiz da sua sub-rvore esquerda dizemos que B o filho esquerdo de A, do mesmo modo, C o filho direito de A. Por isso A o pai dos ns B e C e estes dois so irmos.
A
filho esquerdo de A B C filho direito de A
Ocorre quando todo n que no folha tiver sub-arvores esquerda e direita no vazias.
todo n tem 0 ou 2 filhos.
bibliografia:Szwarcfiter, J. & Markenzon, Lilian. Estrturas de Dados e seus Algoritmos. Rio de Janeiro: LTC, 1994
Tipos de rvores Binrias: Binria Completa uma rvore estritamente binria onde todos os ns folhas se encontram ou no ltimo ou no penltimo nvel da rvore.
Binria Completa
bibliografia:Szwarcfiter, J. & Markenzon, Lilian. Estrturas de Dados e seus Algoritmos. Rio de Janeiro: LTC, 1994
Binria Cheia
rvore estritamente binria onde os ns folhas se encontram no ltimo nvel. O nmero total de ns em (tn) em uma rvore binria cheia de altura h :
Assim, pela mesma frmula podemos afirmar que, numa rvore binria completa, a altura h de uma rvore dada por: Embora a rvore binria completa possua muitos ns, a distncia da raiz at qualquer folha (profundidade) relativamente pequena.
Nivelamento - PIPCA 2012/1 6
h= log2(tn+1) tn=2h-1
A B
D E F
C
B C
G
D
chave do n
Nivelamento - PIPCA 2012/1 7
Regra: O operador de menor prioridade aparece na raiz; A sub-expresso esquerda desse operador d origem sub-rvore esquerda; A sub-expresso direita do operador d origem sub-rvore direita.
B
Ex: A + B * C
Obs. A notao polonesa ps fixada muito til (principalmente para as mquinas), pois exibe os operadores na ordem de execuo das operaes.
Nivelamento - PIPCA 2012/1 10
Algoritmo para gerar uma rvore binria a partir de uma expresso aritmtica em notao infixa
Procedimento Interpretar(string)->ponteiro COMEO 1. fazer uma rvore com a string como nico n; 2. procurar por operadores de MENOR precedncia (+ ou -) que no estejam dentro de ( e ), pois estes sero considerados um operando.
3. repetir o procedimento 2 com operadores de MDIA precedncia (* e /) S EM NS FOLHA; 4. repetir o procedimento para operadores com MAIOR precedncia (s o ^); 5. percorrer os nos folha (todos contm operandos)
se o operando nmero ou varivel, no mexe. se o operando expresso entre parntesis, substituir esse n por Interpretar(expresso sem os parntesis);
se tem, substitua a rvore por uma com o operador no n raiz e com os operandos nos ns folha. (se voc procurar o PRIMEIRO operando com menor precedncia, basta dividir a rvore como explicado e aplicar esse procedimento de procurar operador de menor precedncia recursivamente no n da DIREITA). Lembre-se que um operando um nmero, uma varivel uma expresso entre parntesis ou uma funo.
FIM Interpretar.
11
12
apresentam uma relao de ordem entre os nodos ordem definida por um campo denominado chave no permite chaves duplicadas, ou seja, cada n tem um valor de chave diferente
esq chave dir
13
raiz
filho da direita: valor da chave maior que o valor da chave do n pai
300
800
150
400
600
900
14
Classe representando um n
public class BSTNode { protected int key; protected BSTNode left, right; public BSTNode() { left = right = null; } public BSTNode(int num) { this(num,null,null); } public BSTNode(int num, BSTNode lt, BSTNode rt) { this.key = num; left = lt; right = rt; } public int getKey() { return key; } public void setKey(int key) { this.key = key; } public BSTNode getLeft() { return left; } public void setLeft(BSTNode left) { this.left = left; } public BSTNode getRight() { return right; } public void setRight(BSTNode right) { this.right = right; } }
15
Busca de um valor
A procura de um valor em uma rvore binria algo mais rpido do que a procura em listas encadeadas ou vetores. Para cada n, compare a chave a ser localizada com o valor armazenado no n correntemente apontado.
Se a chave for menor, v para a sub-rvore esquerda e tente novamente, seno v para a sub-rvore direita.
A busca pra quando for encontrado o n ou quando no h mais meios de continuar (n folha), pois a chave no est na rvore. A complexidade pode ser medida pelo nmero de comparaes feitas durante o processo de busca. Isso depende do nmero de ns encontrados no nico caminho que leva da raiz ao n procurado. Ento a complexidade, depende da forma da rvore e da posio do n procurado na rvore. O nmero mdio de comparaes em uma busca (lg n), pois a altura de uma rvore binria completa (perfeitamente balanceada) h=lg (n+1) .
Nivelamento - PIPCA 2012/1 17
Busca
public BSTNode search (int el) { return search(root,el); } private BSTNode search (BSTNode p, int el) { while (p != null) { /* se valor procurado == chave do n, retorna referncia ao n */ if (el==p.key) return p; /* se valor procurado < chave do n, procurar na sub-rvore esquerda deste n */ else if (el<p.key) p = p.left; /* se valor procurado > chave do n, procurar na sub-rvore direita deste n */ else p = p.right; } // caso chave no foi achada, retorna null return null; }
18
19
o processo de visitar cada n da rvore exatamente uma vez. Visitar: Fazer algo com o n como exibi-lo, grav-lo, etc. O percurso pode ser interpretado como colocar todos os ns em uma linha ou a linearizao da rvore. Os percursos podem ser em extenso ou em profundidade.
Percursos em extenso: visitam todos os ns de cada nvel, nvel por nvel (indo do mais alto ao mais baixo, ou vice-versa). Percursos em profundidade: percorre os caminhos das rvores. Percorre primeiramente todo o caminho mais a esquerda, e assim por diante.
Nivelamento - PIPCA 2012/1 20
IN-ORDEM (esquerda-raiz-direita):
percorre a sub-rvore esquerda; visita o n; percorre a sub-rvore direita.
21
Percurso in-ordem public void inorder() { inorder(root); } private void inorder (BSTNode p) { if (p != null) { inorder(p.left); System.out.print(p.key + " "); inorder(p.right); } }
Nivelamento - PIPCA 2012/1 22
Percurso em pre-ordem public void preorder() { preorder(root); } private void preorder(BSTNode p) { if (p != null) { System.out.print(p.key + " "); preorder(p.left); preorder(p.right); } }
Nivelamento - PIPCA 2012/1 23
Percurso em ps-ordem public void postorder() { postorder(root); } private void postorder(BSTNode p) { if (p != null) { postorder(p.left); postorder(p.right); System.out.print(p.key + " "); } }
Nivelamento - PIPCA 2012/1 24
Remoo de um n
antes
50
depois
50
30
80
30
90
80
15
40
60
40
60
90
25
Remoo de um n Caso 2: O n tem um filho: o ponteiro do pai aponta para o filho deste
antes
50
depois
50
30
80
40
90
Nivelamento - PIPCA 2012/1
80
40
60
60
90
26
Remoo de um n Caso 3: O n tem 2 filhos. Neste caso podemos fazer a remoo de duas maneiras:
remoo por cpia; remoo por fuso
antes
50
30
80
15
40
60
90
27
Remoo por cpia remove uma chave k1 (chave do n que se quer remover):
sobrescrevendo-a por uma outra chave k2 (o maior valor na sub-rvore esquerda, pois este vai ser maior que todos os valores da sub-rvore esquerda) e ento removendo o n que contem k2 (que ser um dos casos simples: folha, ou n com apenas um filho).
28
Final
29
protected BSTNode searchFather (int el) { BSTNode p = root; BSTNode prev = null; // acha o n p com a chave el while (p != null && !(p.key==el)) { prev = p; if (p.key<el) p = p.right; else p = p.left; } if (p!=null && p.key==el) return prev; return null; }
31
Remoo por fuso A soluo consiste em fusionar as duas subrvores do n a ser deletado em uma. Para tanto, como na organizao da rvore binria, todos os valores da sub-rvore a esquerda so menores que os valores da sub-rvore a direita, deve se encontrar o maior valor na sub-rvore esquerda e torn-lo a raiz da sub-rvore direita. Tambm pode-se procurar o n com menor valor da sub-rvore direita. Remove a chave, removendo o n que contm a chave. E o pai do n removido passa a apontar para a nova sub-rvore.
32
Final
33
Heap uma estrutura de dados baseada em rvore (especializada) Propriedade do heap se B filho de um n A, ento a chave(A) >= chave (B) (maior elemento na raiz). Chamada max heap. Pode-se comparar ao contrrio, dai temos o min heap. Usado para implementar priority queues Applet: vamos ver o funcionamento http://people.ksp.sk/~kuko/bak/index.html
Max HEAP
http://students.ceid.upatras.gr/~perisian/data_struct ure/HeapSort/heap_applet.html
Implementao A remoo do heap feita ordenando os elementos. Implementao do heap atravs de array a:
Indexao
filhos a[2i+1] e a[2i+2] pais a[floor((i1)/2)]
Heap binrio um heap criado usando-se rvore binria, com duas restries:
Propriedade de shape: rvore completa (todos os nveis da rvores preenchidos, exceto possivelmente o ltimo...) preenchimento da esquerda para a direita Propriedade de heap: cada n maior do que seus filhos
Operaes:
Insero Remoo
40
Exemplos Insero
41
BSP
Quadtree
Octree
Nivelamento - PIPCA
42