A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -

Apresentações semelhantes


Apresentação em tema: "Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -"— Transcrição da apresentação:

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


Carregar ppt "Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -"

Apresentações semelhantes


Anúncios Google