Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouMarcelo Miguel Alterado mais de 9 anos atrás
1
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
2
Programação II – Prof. Mateus Raeder Árvores Binárias de Pesquisa Conhecida também como: –Árvore binária ordenada –Árvore binária de busca Apresenta relação de ordem entre os nodos Ordem definida através do campo chamado chave Chaves duplicadas não são permitidas –Cada nó possui uma chave única na árvore ! CHAVE
3
Programação II – Prof. Mateus Raeder Árvores Binárias de Pesquisa Não há chaves duplicadas!!! 13 8 4 26 57911 12 1014 1315 FILHO DA ESQUERDA Valor da chave MENOR que a chave do pai FILHO DA DIREITA Valor da chave MAIOR que a chave do pai Raiz
4
Programação II – Prof. Mateus Raeder Árvores Binárias de Pesquisa Crie árvores inserindo os seguintes nós (em ordem): –a) 57, 22, 10, 60, 88, 15, 0, 22 –b) j, x, o, m, z, a, j, h, i 57 22 10 60 88 15 0 a) b) j x zo m a h i
5
Programação II – Prof. Mateus Raeder Classe Nodo Binário 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; }
6
Programação II – Prof. Mateus Raeder Classe Nodo Binário 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; } }
7
Programação II – Prof. Mateus Raeder Classe Árvore Binária de Pesquisa public class BST { private BSTNode root = null; public BST () { } public void clear () { root = null; } public boolean isEmpty () { return root == null; } public BSTNode getRootNode (){ return root; }
8
Programação II – Prof. Mateus Raeder Busca de valor A procura de um valor em uma árvore binária é mais rápida do que em listas ou vetores. Como funciona: –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 Senão vá para a sub-árvore direita, e tente novamente –A busca para quando: For encontrado o nó Ou quando não há mais meios de continuar, pois a chave não está na árvore
9
Programação II – Prof. Mateus Raeder Busca de valor 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 referência 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 não foi achada, retorna null return null; }
10
Programação II – Prof. Mateus Raeder Exemplo de busca de valor 13 8 4 26 57911 12 1014 1315 el = 11 public BSTNode search (int el) { return search(root,el); } private BSTNode search (BSTNode p, int el) { while (p != null) { if (el==p.key) return p; else if (el<p.key) p = p.left; else p = p.right; } return null; } p
11
Programação II – Prof. Mateus Raeder Exemplo de busca de valor 13 8 4 26 57911 12 1014 1315 el = 11 public BSTNode search (int el) { return search(root,el); } private BSTNode search (BSTNode p, int el) { while (p != null) { if (el==p.key) return p; else if (el<p.key) p = p.left; else p = p.right; } return null; } p
12
Programação II – Prof. Mateus Raeder Exemplo de busca de valor 13 8 4 26 57911 12 1014 1315 el = 11 public BSTNode search (int el) { return search(root,el); } private BSTNode search (BSTNode p, int el) { while (p != null) { if (el==p.key) return p; else if (el<p.key) p = p.left; else p = p.right; } return null; } p
13
Programação II – Prof. Mateus Raeder Exemplo de busca de valor 13 8 4 26 57911 12 1014 1315 el = 11 public BSTNode search (int el) { return search(root,el); } private BSTNode search (BSTNode p, int el) { while (p != null) { if (el==p.key) return p; else if (el<p.key) p = p.left; else p = p.right; } return null; } p
14
Programação II – Prof. Mateus Raeder Exemplo de busca de valor 13 8 4 26 57911 12 1014 1315 el = 11 public BSTNode search (int el) { return search(root,el); } private BSTNode search (BSTNode p, int el) { while (p != null) { if (el==p.key) return p; else if (el<p.key) p = p.left; else p = p.right; } return null; } p
15
Programação II – Prof. Mateus Raeder Exemplo de busca de valor 13 8 4 26 57911 12 1014 1315 el = 11 public BSTNode search (int el) { return search(root,el); } private BSTNode search (BSTNode p, int el) { while (p != null) { if (el==p.key) return p; else if (el<p.key) p = p.left; else p = p.right; } return null; } p
16
Programação II – Prof. Mateus Raeder Exemplo de busca de valor 13 8 4 26 57911 12 1014 1315 el = 11 public BSTNode search (int el) { return search(root,el); } private BSTNode search (BSTNode p, int el) { while (p != null) { if (el==p.key) return p; else if (el<p.key) p = p.left; else p = p.right; } return null; } p
17
Programação II – Prof. Mateus Raeder Exemplo de busca de valor 13 8 4 26 57911 12 1014 1315 el = 11 public BSTNode search (int el) { return search(root,el); } private BSTNode search (BSTNode p, int el) { while (p != null) { if (el==p.key) return p; else if (el<p.key) p = p.left; else p = p.right; } return null; } p
18
Programação II – Prof. Mateus Raeder Exemplo de busca de valor 13 8 4 26 57911 12 1014 1315 el = 11 public BSTNode search (int el) { return search(root,el); } private BSTNode search (BSTNode p, int el) { while (p != null) { if (el==p.key) return p; else if (el<p.key) p = p.left; else p = p.right; } return null; } p
19
Programação II – Prof. Mateus Raeder Exemplo de busca de valor 13 8 4 26 57911 12 1014 1315 el = 11 public BSTNode search (int el) { return search(root,el); } private BSTNode search (BSTNode p, int el) { while (p != null) { if (el==p.key) return p; else if (el<p.key) p = p.left; else p = p.right; } return null; } p
20
Programação II – Prof. Mateus Raeder Exemplo de busca de valor 13 8 4 26 57911 12 1014 1315 el = 11 public BSTNode search (int el) { return search(root,el); } private BSTNode search (BSTNode p, int el) { while (p != null) { if (el==p.key) return p; else if (el<p.key) p = p.left; else p = p.right; } return null; } p
21
Programação II – Prof. Mateus Raeder Exemplo de busca de valor 13 8 4 26 57911 12 1014 1315 el = 11 public BSTNode search (int el) { return search(root,el); } private BSTNode search (BSTNode p, int el) { while (p != null) { if (el==p.key) return p; else if (el<p.key) p = p.left; else p = p.right; } return null; } p
22
Programação II – Prof. Mateus Raeder Exemplo de busca de valor 13 8 4 26 57911 12 1014 1315 el = 11 public BSTNode search (int el) { return search(root,el); } private BSTNode search (BSTNode p, int el) { while (p != null) { if (el==p.key) return p; else if (el<p.key) p = p.left; else p = p.right; } return null; } p
23
Programação II – Prof. Mateus Raeder Exemplo de busca de valor 13 8 4 26 57911 12 1014 1315 el = 11 public BSTNode search (int el) { return search(root,el); } private BSTNode search (BSTNode p, int el) { while (p != null) { if (el==p.key) return p; else if (el<p.key) p = p.left; else p = p.right; } return null; } p
24
Programação II – Prof. Mateus Raeder Inserindo uma nova chave public boolean insert (int el) { BSTNode p = root, prev = null; // caso o valor já exista na árvore, não inserir e retornar false if (search(el)!=null) return false; // procurando um lugar para colocar o novo nó while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } // se árvore vazia if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; }
25
Programação II – Prof. Mateus Raeder Exemplo de inserção public boolean insert (int el) { BSTNode p = root, prev = null; if (search(el)!=null) return false; while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; } el = 20 p prev
26
Programação II – Prof. Mateus Raeder Exemplo de inserção public boolean insert (int el) { BSTNode p = root, prev = null; if (search(el)!=null) return false; while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; } el = 20 p prev
27
Programação II – Prof. Mateus Raeder Exemplo de inserção public boolean insert (int el) { BSTNode p = root, prev = null; if (search(el)!=null) return false; while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; } el = 20 p prev
28
Programação II – Prof. Mateus Raeder Exemplo de inserção public boolean insert (int el) { BSTNode p = root, prev = null; if (search(el)!=null) return false; while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; } el = 20 p prev 20
29
Programação II – Prof. Mateus Raeder Exemplo de inserção public boolean insert (int el) { BSTNode p = root, prev = null; if (search(el)!=null) return false; while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; } el = 20 p prev 20
30
Programação II – Prof. Mateus Raeder Exemplo de inserção public boolean insert (int el) { BSTNode p = root, prev = null; if (search(el)!=null) return false; while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; } el = 23 20
31
Programação II – Prof. Mateus Raeder Exemplo de inserção public boolean insert (int el) { BSTNode p = root, prev = null; if (search(el)!=null) return false; while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; } el = 23 p prev 20
32
Programação II – Prof. Mateus Raeder Exemplo de inserção public boolean insert (int el) { BSTNode p = root, prev = null; if (search(el)!=null) return false; while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; } el = 23 p prev 20
33
Programação II – Prof. Mateus Raeder Exemplo de inserção public boolean insert (int el) { BSTNode p = root, prev = null; if (search(el)!=null) return false; while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; } el = 23 p prev 20
34
Programação II – Prof. Mateus Raeder Exemplo de inserção public boolean insert (int el) { BSTNode p = root, prev = null; if (search(el)!=null) return false; while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; } el = 23 p prev 20
35
Programação II – Prof. Mateus Raeder Exemplo de inserção public boolean insert (int el) { BSTNode p = root, prev = null; if (search(el)!=null) return false; while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; } el = 23 p prev 20
36
Programação II – Prof. Mateus Raeder Exemplo de inserção public boolean insert (int el) { BSTNode p = root, prev = null; if (search(el)!=null) return false; while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; } el = 23 p prev 20
37
Programação II – Prof. Mateus Raeder Exemplo de inserção public boolean insert (int el) { BSTNode p = root, prev = null; if (search(el)!=null) return false; while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; } el = 23 p prev 20
38
Programação II – Prof. Mateus Raeder Exemplo de inserção public boolean insert (int el) { BSTNode p = root, prev = null; if (search(el)!=null) return false; while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; } el = 23 p prev 20
39
Programação II – Prof. Mateus Raeder Exemplo de inserção public boolean insert (int el) { BSTNode p = root, prev = null; if (search(el)!=null) return false; while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; } el = 23 p prev 20 23
40
Programação II – Prof. Mateus Raeder Exemplo de inserção public boolean insert (int el) { BSTNode p = root, prev = null; if (search(el)!=null) return false; while (p != null) { prev = p; if (el<p.key) p = p.left; else p = p.right; } if (root == null) root = new BSTNode(el); else if (prev.key<el) prev.right = new BSTNode(el); else prev.left = new BSTNode(el); return true; } el = 23 p prev 20 23
41
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa É o processo de visitar cada nó da árvore exatamente uma vez. O percurso pode ser interpretado como colocar todos os nós em uma linha ou a linearização da árvore. Os percursos podem ser em extensão ou em profundidade. – Percursos em extensão : visitam todos os nós de cada nível, nível por nível (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. Visitar : Fazer algo com o nó como exibi-lo, gravá-lo, etc.
42
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita. PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó; Notação polonesa pós-fixada Notação polonesa pré-fixada Forma original (infixada)
43
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
44
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / - Visita o nó + PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
45
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / - Visita o nó - Percorre esquerda + - Visita o nó PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
46
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / - Visita o nó - Percorre esquerda + * - Visita o nó - Percorre esquerda - Visita o nó PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
47
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / - Visita o nó - Percorre esquerda + * 3 - Visita o nó - Percorre esquerda - Visita o nó - Percorre esquerda - Percorre direita PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
48
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / - Visita o nó - Percorre esquerda + * 3 - Visita o nó - Percorre esquerda - Percorre direita - Visita o nó PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
49
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / - Visita o nó - Percorre esquerda + * 3 7 - Visita o nó - Percorre esquerda - Percorre direita - Visita o nó - Percorre esquerda - Percorre direita PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
50
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / - Visita o nó - Percorre esquerda + * 3 7 - Visita o nó - Percorre esquerda - Percorre direita PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
51
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / - Visita o nó - Percorre esquerda + * 3 7 PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
52
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / - Visita o nó - Percorre esquerda - Percorre direita + * 3 7 - Visita o nó PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
53
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / - Visita o nó - Percorre esquerda - Percorre direita + * 3 7 / - Visita o nó - Percorre esquerda - Visita o nó PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
54
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / - Visita o nó - Percorre esquerda - Percorre direita + * 3 7 / 6 - Visita o nó - Percorre esquerda - Visita o nó - Percorre esquerda - Percorre direita PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
55
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / - Visita o nó - Percorre esquerda - Percorre direita + * 3 7 / 6 - Visita o nó - Percorre esquerda PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
56
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / - Visita o nó - Percorre esquerda - Percorre direita + * 3 7 / 6 - Visita o nó - Percorre esquerda - Percorre direita - Visita o nó PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
57
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / - Visita o nó - Percorre esquerda - Percorre direita + * 3 7 / 6 10 - Visita o nó - Percorre esquerda - Percorre direita - Visita o nó - Percorre esquerda - Percorre direita PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
58
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / - Visita o nó - Percorre esquerda - Percorre direita + * 3 7 / 6 10 - Visita o nó - Percorre esquerda - Percorre direita PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
59
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / - Visita o nó - Percorre esquerda - Percorre direita + * 3 7 / 6 10 PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
60
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: Notação polonesa pré-fixada 610 + * 37 / + * 3 7 / 6 10 Caminhamento em pré-ordem: PRÉ-ORDEM (raiz-esquerda-direita): - visita o nó; - percorre a sub-árvore esquerda; - percorre a sub-árvore direita;
61
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Notação polonesa pós-fixada - Percorre esquerda PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
62
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Notação polonesa pós-fixada - Percorre esquerda - Percorre direita PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
63
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Notação polonesa pós-fixada - Percorre esquerda - Percorre direita - Visita o nó 3 PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
64
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Notação polonesa pós-fixada - Percorre esquerda 3 PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
65
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Notação polonesa pós-fixada - Percorre esquerda - Percorre direita 3 PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
66
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Notação polonesa pós-fixada - Percorre esquerda - Percorre direita 3 - Percorre esquerda - Percorre direita PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
67
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Notação polonesa pós-fixada - Percorre esquerda - Percorre direita 3 7 - Percorre esquerda - Percorre direita - Visita o nó PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
68
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Notação polonesa pós-fixada - Percorre esquerda - Percorre direita 3 7 PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
69
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Notação polonesa pós-fixada - Percorre esquerda - Percorre direita - Visita o nó 3 7 * PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
70
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Notação polonesa pós-fixada 3 7 * PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
71
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Percorre direita Notação polonesa pós-fixada 3 7 * - Percorre esquerda - Percorre direita PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
72
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Percorre direita Notação polonesa pós-fixada 3 7 * 6 - Percorre esquerda - Percorre direita - Visita o nó PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
73
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Percorre direita Notação polonesa pós-fixada 3 7 * 6 - Percorre esquerda PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
74
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Percorre direita Notação polonesa pós-fixada 3 7 * 6 - Percorre esquerda - Percorre direita - Percorre esquerda - Percorre direita PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
75
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Percorre direita Notação polonesa pós-fixada 3 7 * 6 10 - Percorre esquerda - Percorre direita - Percorre esquerda - Percorre direita - Visita o nó PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
76
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Percorre direita Notação polonesa pós-fixada 3 7 * 6 10 - Percorre esquerda - Percorre direita PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
77
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Percorre direita Notação polonesa pós-fixada 3 7 * 6 10 / - Percorre esquerda - Percorre direita - Visita o nó PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
78
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Percorre direita Notação polonesa pós-fixada 3 7 * 6 10 / PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
79
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Percorre direita - Visita o nó Notação polonesa pós-fixada 3 7 * 6 10 / + PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
80
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / Notação polonesa pós-fixada 3 7 * 6 10 / + Caminhamento em pós-ordem: PÓS-ORDEM (esquerda-direita- raiz): - percorre a sub-árvore esquerda; - percorre a sub-árvore direita; - visita o nó;
81
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Forma original (infixada) - Percorre esquerda IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
82
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Forma original (infixada) - Percorre esquerda - Visita o nó 3 IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
83
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Forma original (infixada) - Percorre esquerda - Visita o nó - Percorre direita 3 IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
84
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Forma original (infixada) - Percorre esquerda 3 IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
85
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Forma original (infixada) - Percorre esquerda - Visita o nó 3 * IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
86
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Forma original (infixada) - Percorre esquerda - Visita o nó - Percorre direita 3 * - Percorre esquerda IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
87
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Forma original (infixada) - Percorre esquerda - Visita o nó - Percorre direita 3 * 7 - Percorre esquerda - Visita o nó IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
88
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Forma original (infixada) - Percorre esquerda - Visita o nó - Percorre direita 3 * 7 - Percorre esquerda - Visita o nó - Percorre direita IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
89
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Forma original (infixada) - Percorre esquerda - Visita o nó - Percorre direita 3 * 7 IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
90
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda Forma original (infixada) 3 * 7 IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
91
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Visita o nó Forma original (infixada) 3 * 7 + IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
92
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Visita o nó - Percorre direita Forma original (infixada) 3 * 7 + - Percorre esquerda IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
93
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Visita o nó - Percorre direita Forma original (infixada) 3 * 7 + 6 - Percorre esquerda - Visita o nó IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
94
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Visita o nó - Percorre direita Forma original (infixada) 3 * 7 + 6 - Percorre esquerda - Visita o nó - Percorre direita IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
95
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Visita o nó - Percorre direita Forma original (infixada) 3 * 7 + 6 - Percorre esquerda IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
96
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Visita o nó - Percorre direita Forma original (infixada) 3 * 7 + 6 / - Percorre esquerda - Visita o nó IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
97
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Visita o nó - Percorre direita Forma original (infixada) 3 * 7 + 6 / - Percorre esquerda - Visita o nó - Percorre esquerda IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
98
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Visita o nó - Percorre direita Forma original (infixada) 3 * 7 + 6 / 10 - Percorre esquerda - Visita o nó - Percorre esquerda - Visita o nó IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
99
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Visita o nó - Percorre direita Forma original (infixada) 3 * 7 + 6 / 10 - Percorre esquerda - Visita o nó - Percorre esquerda - Visita o nó - Percorre direita IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
100
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Visita o nó - Percorre direita Forma original (infixada) 3 * 7 + 6 / 10 - Percorre esquerda - Visita o nó - Percorre esquerda IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
101
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / - Percorre esquerda - Visita o nó - Percorre direita Forma original (infixada) 3 * 7 + 6 / 10 IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
102
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Os três mais comuns tipos de percursos em profundidade, definidos recursivamente, são: 610 + * 37 / Forma original (infixada) 3 * 7 + 6 / 10 Caminhamento em in-ordem: IN-ORDEM (esquerda-raiz-direita): - percorre a sub-árvore esquerda; - visita o nó; - percorre a sub-árvore direita.
103
Programação II – Prof. Mateus Raeder Percorra cada uma das árvores abaixo em PÓS-, PRÉ- e IN-ORDEM: 30 52 50 60 Caminhamento em Árvores Binárias de Pesquisa 5070 40 20 30 60 65 68 40 5445 78 40 20 95 8 13 10 a) b)c) 17 IN-ORDEM - percorre esquerda; - visita o nó; - percorre direita. PRÉ-ORDEM - visita o nó; - percorre esquerda; - percorre direita; PÓS-ORDEM - percorre esquerda; - percorre direita; - visita o nó;
104
Programação II – Prof. Mateus Raeder Caminhamento em Árvores Binárias de Pesquisa Respostas: a) PÓS-ORDEM: 30 - 20 - 50 - 68 - 65 - 70 - 60 - 40 PRÉ-ORDEM: 40 - 20 - 30 - 60 - 50 - 70 - 65 - 68 IN-ORDEM: 20 - 30 - 40 - 50 - 60 - 65 - 68 - 70 b) PÓS-ORDEM: 45 - 52 - 54 - 50 - 78 - 60 - 40 PRÉ-ORDEM: 40 - 60 - 50 - 45 - 54 - 52 - 78 IN-ORDEM: 40 - 45 - 50 - 52 - 54 - 60 - 78 c) PÓS-ORDEM: 5 - 9 - 8 - 13 - 17 - 10 - 30 - 20 - 40 PRÉ-ORDEM: 40 - 20 - 10 - 8 - 5 - 9 - 17 - 13 - 30 IN-ORDEM: 5 - 8 - 9 - 10 - 13 - 17 - 20 - 30 - 40 IN-ORDEM - percorre esquerda; - visita o nó; - percorre direita. PRÉ-ORDEM - visita o nó; - percorre esquerda; - percorre direita; PÓS-ORDEM - percorre esquerda; - percorre direita; - visita o nó;
105
Programação II – Prof. Mateus Raeder 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); } } IN-ORDEM - percorre esquerda; - visita o nó; - percorre direita.
106
Programação II – Prof. Mateus Raeder PRÉ-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); } } PRÉ-ORDEM - visita o nó; - percorre esquerda; - percorre direita;
107
Programação II – Prof. Mateus Raeder PÓS-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 + " "); } } PÓS-ORDEM - percorre esquerda; - percorre direita; - visita o nó;
108
Programação II – Prof. Mateus Raeder Remoção de um nó Ao remover um nó, 3 situações podem ocorrer : – Situação 1 : Exclusão de uma folha O nó é uma folha e não tem filhos –o ponteiro do seu pai é ajustado para nulo. 5070 40 20 10 30 60 Nodo a ser excluído 5070 40 20 30 60
109
Programação II – Prof. Mateus Raeder Remoção de um nó Ao remover um nó, 3 situações podem ocorrer : – Situação 2 : Nodo tem um filho Ponteiro do pai aponta para o filho deste nodo 5070 40 20 30 60 Nodo a ser excluído 5070 40 3060
110
Programação II – Prof. Mateus Raeder Remoção de um nó Ao remover um nó, 3 situações podem ocorrer : – Situação 3 : Nodo tem dois filhos Dois tipos de remoção –Por cópia –Por fusão 5070 40 20 1030 60 Nodo a ser excluído
111
Programação II – Prof. Mateus Raeder Remoção por cópia Remove uma chave X (chave do nó que se quer remover): – sobrescrevendo-a por uma outra chave Y Y é o maior valor na sub-árvore esquerda, pois este vai ser maior que todos os valores da sub-árvore esquerda e ao mesmo tempo menor que os valores da sub-árvore direita –e então removendo o nó que contem Y que será um dos casos simples: folha, ou nó com apenas um filho
112
Programação II – Prof. Mateus Raeder Remoção por cópia 5070 40 20 1030 60 5257 55 1 56 Maior valor da sub-árvore esquerda 5070 40 20 1030 57 52 57 55 2 56 Copia
113
Programação II – Prof. Mateus Raeder Remoção por cópia 5070 40 20 1030 57 52 57 55 3 56 Deleta nodo (situação 1 ou 2) 5070 40 20 1030 57 5256 55 Final
114
Programação II – Prof. Mateus Raeder Encontra o pai de um nodo 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; }
115
Programação II – Prof. Mateus Raeder 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; } Exemplo de encontro de pai 5070 40 20 1030 57 p el = 50
116
Programação II – Prof. Mateus Raeder 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; } Exemplo de encontro de pai 5070 40 20 1030 57 p prev el = 50
117
Programação II – Prof. Mateus Raeder 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; } Exemplo de encontro de pai 5070 40 20 1030 57 p prev el = 50
118
Programação II – Prof. Mateus Raeder 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; } Exemplo de encontro de pai 5070 40 20 1030 57 p prev el = 50
119
Programação II – Prof. Mateus Raeder 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; } Exemplo de encontro de pai 5070 40 20 1030 57 p prev el = 50 ? Sim
120
Programação II – Prof. Mateus Raeder 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; } Exemplo de encontro de pai 5070 40 20 1030 57 p prev el = 50
121
Programação II – Prof. Mateus Raeder 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; } Exemplo de encontro de pai 5070 40 20 1030 57 p prev el = 50
122
Programação II – Prof. Mateus Raeder 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; } Exemplo de encontro de pai 5070 40 20 1030 57 p prev el = 50
123
Programação II – Prof. Mateus Raeder 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; } Exemplo de encontro de pai 5070 40 20 1030 57 p prev el = 50
124
Programação II – Prof. Mateus Raeder 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; } Exemplo de encontro de pai 5070 40 20 1030 57 p prev el = 50 ? Não
125
Programação II – Prof. Mateus Raeder 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; } Exemplo de encontro de pai 5070 40 20 1030 57 p prev el = 50
126
Programação II – Prof. Mateus Raeder 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; } Exemplo de encontro de pai 5070 40 20 1030 57 p prev el = 50
127
Programação II – Prof. Mateus Raeder 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; } Exemplo de encontro de pai 5070 40 20 1030 57 p prev el = 50
128
Programação II – Prof. Mateus Raeder 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; } Exemplo de encontro de pai 5070 40 20 1030 57 p prev el = 50
129
Programação II – Prof. Mateus Raeder 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; } Exemplo de encontro de pai 5070 40 20 1030 57 p prev el = 50
130
Programação II – Prof. Mateus Raeder Remoção por cópia public void deleteByCopying (int el) { BSTNode node, father = null; node = search (el) ; // procura nó a ser deletado if (node != null && node.key==el) { if (node!=root) father = searchFather (el); // procura pai do nó a ser deletado if (node.right == null){ // nó não tem filho direito (situação 2 ou situação 1); if (node==root) root= node.left; else if (father.left == node) father.left = node.left; else father.right = node.left; } else if (node.left == null) { // nó não tem filho esquerdo (caso 2) if (node==root) root= node.right; else if (father.left == node) father.left = node.right; else father.right = node.right; } else { // nó tem ambos os filhos: fazer remoção por cópia BSTNode tmp = node.left; // 1. pegando sub-arvore esquerda while (tmp.right != null) // 2. acha a posição mais a direita da sub-árvore esquerda do nó tmp = tmp.right; deleteByCopying (tmp.key); // remove por copia o nó que possui o maior valor // da sub-arvore esquerda do nó a ser deletado node.key = tmp.key; // copia valor da chave do maior nó da sub-árvore esquerda } } else if (root != null) System.out.println("el " + el + " is not in the tree"); else System.out.println("the tree is empty"); }
131
Programação II – Prof. Mateus Raeder Exemplo de remoção por cópia public void deleteByCopying (int el) { BSTNode node, father = null; node = search (el) ; if (node != null && node.key==el) { if (node!=root) father = searchFather (el); if (node.right == null){ if (node==root) root= node.left; else if (father.left == node) father.left = node.left; else father.right = node.left; } else if (node.left == null) { if (node==root) root= node.right; else if (father.left == node) father.left = node.right; else father.right = node.right; } else { BSTNode tmp = node.left; while (tmp.right != null) tmp = tmp.right; deleteByCopying (tmp.key); node.key = tmp.key; } } else if (root != null) System.out.println("el " + el + " is not in the tree"); else System.out.println("the tree is empty"); } 5070 40 20 1030 60 5257 55 56
132
Programação II – Prof. Mateus Raeder Remoção por fusão A solução consiste em fusionar as duas sub-árvores do nó a ser deletado em uma. Como na organização da árvore binária, todos os valores da sub-árvore a esquerda são menores que os valores da sub-árvore a direita –Deve-se encontrar o maior valor na sub-árvore esquerda (o mais na direita) –Este maior nó passa a ser pai da sub-árvore direita do nó a ser removido –Remove a chave, removendo o nó que contém a chave –E o pai do nó removido passa a apontar para a nova sub- árvore
133
Programação II – Prof. Mateus Raeder Remoção por fusão 5070 40 20 1030 60 5257 55 1 56 Maior valor da sub-árvore esquerda 5070 40 20 1030 60 52 57 55 2 56 Passa a ser pai
134
Programação II – Prof. Mateus Raeder Remoção por fusão 50 70 40 20 1030 60 5257 55 3 56 40 20 1030 Final 50 70 5257 55 56
135
Programação II – Prof. Mateus Raeder Remoção por fusão public void deleteByMerging (int el) { BSTNode tmp, node,father = null; node = search (el) ; // procura nó a ser deletado if (node != null && node.key==el) { if (node!=root) father = searchFather (el); // procura pai do nó a ser removido if (node.right == null){ // nó não tem filho direito (situações 1 e 2); if (root==node) root=node.left; else if (father.left == node) father.left = node.left; else father.right = node.left; } else if (node.left == null) { // nó não tem filho esquerdo (situação 2) if (root==node) root=node.right; else if (father.left == node) father.left = node.right; else father.right = node.right; } else { // se tem dois filhos, faz deleção por fusão tmp = node.left; // pega sub-arvore esquerda while (tmp.right != null) tmp = tmp.right; // pega filho mais a direita da sub-arvore esquerda tmp.right = node.right; // filho + a direita da sub-arvore esquerda passa a ter // como filho direito o filho direito do nó a ser deletado if (root==node) root = node.left; else if (father.left == node) father.left = node.left; else father.right = node.left; } } else if (root != null) System.out.println("el " + el + " is not in the tree"); else System.out.println("the tree is empty"); }
136
Programação II – Prof. Mateus Raeder Exemplo de remoção por fusão public void deleteByMerging (int el) { BSTNode tmp, node,father = null; node = search (el) ; if (node != null && node.key==el) { if (node!=root) father = searchFather (el); if (node.right == null){ if (root==node) root=node.left; else if (father.left == node) father.left = node.left; else father.right = node.left; } else if (node.left == null) { if (root==node) root=node.right; else if (father.left == node) father.left = node.right; else father.right = node.right; } else { tmp = node.left; while (tmp.right != null) tmp = tmp.right; tmp.right = node.right; if (root==node) root = node.left; else if (father.left == node) father.left = node.left; else father.right = node.left; } } else if (root != null) System.out.println("el " + el + " is not in the tree"); else System.out.println("the tree is empty"); } 5070 40 20 1030 60 5257 55 56
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.