Árvores Binárias de Pesquisa. Programação II Prof. Mateus Raeder. Árvores Binárias de Pesquisa. Árvores Binárias de Pesquisa. Classe Nodo Binário



Documentos relacionados
EAD Árvore - representação usando listas ligadas

EAD Árvore árvore binária

Algoritmos e Estruturas de Dados: Árvore Binária

Árvores Binárias de Busca

Árvore Binária de Busca

INF 1007 Programação II

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

Métodos Computacionais. Árvores

Pesquisa em Memória Primária. Prof. Jonas Potros

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 CES-11 CES-11

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

Linguagem C: Árvores Binarias

ESTRUTURAS DE DADOS E ALGORITMOS ÁRVORE BINÁRIA

Árvores Binárias de Busca

Árvores Binárias. Observação: Material elaborado a partir do material do Professor Marcos Costa.

Busca. Pesquisa sequencial

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação

Algoritmos e Estruturas de Dados 2

ESTRUTURAS DE DADOS II MSc. Daniele Carvalho Oliveira

Estruturas de Dados I

Mo:vação. Árvore AVL. Caracterís:cas. Origem. Exemplo. Exercício 1 Qual é a altura dos nodos 50 e 44?

Estruturas de Dados Aula 15: Árvores 17/05/2011

Algoritmos e Estruturas de Dados: Árvore Binária de Busca

Algoritmos e Estrutura de Dados. Aula 13 Estrutura de Dados: Árvores de Pesquisa Binária Prof. Tiago A. E. Ferreira

Pesquisa em Memória Primária. Algoritmos e Estruturas de Dados II

Árvores e Árvores Binárias

Árvores Binárias - continuação

1. Introdução Definição Conceitos relacionados... 2

struct arv { char info; struct arv* esq; struct arv* dir; };

Árvores Binárias e Busca. Jeane Melo

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15

2ª Lista de Exercícios

Árvores. Algoritmos e Estruturas de Dados 2005/2006

Estruturas de Dados Árvores

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS (C6/6) Curso: Informática

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

Árvore binária - definição

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 6 Filas

Figura 13.1: Um exemplo de árvore de diretório.

PROGRAMAÇÃO II 4. ÁRVORE

Árvores binárias de pesquisa com balanceamento. Algoritmos e Estruturas de Dados II

{ fazer Pós-Ordem sem recursividade. Poderá cair na prova!!! }

Introdução a árvores AVL. Prof. Ernesto Lindstaedt

ESTRUTURA DE DADOS E ALGORITMOS. Árvores Binárias de Busca. Cristina Boeres

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação

ESTRUTURA DE DADOS DCC013

Estrutura de Dados Árvores. Prof. Robinson Alves

FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto e Análise de Algoritmos II Lista de Exercícios 2

AED 2002/2003 p.1/21. Estrutura de dados elementar Métodos de travessia de árvores Procura em árvores binárias. Exemplos de clientes

Aula T20 BCC202 Pesquisa (Parte 2) Árvores de Pesquisa. Túlio Toffolo

Problemas com ABP Desbalanceamento progressivo

INF 1010 Estruturas de Dados Avançadas

Árvores AVL. Prof. Othon M. N. Batista Estrutura de Dados

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira.

Prof. Jesus José de Oliveira Neto

Árvores Binária de Busca. Prof. César Melo DCC/ICE/UFAM

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti

Árvores Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação

Árvore Binária de Busca. Prof. César Melo

UFSC-CTC-INE INE Estruturas de Dados. Árvores. Prof. Ronaldo S. Mello 2002/2. Árvore

ÁRVORE BINÁRIA DE BUSCA

GGI026 - Árvore rubro-negra - Remoção

Algoritmos e Estruturas de Dados

DAINF - Departamento de Informática

Árvores binárias de pesquisa

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Classificação e Pesquisa de Dados

Árvore B UNITINS ANÁLISE E DESENVOLVIMENTO DE SISTEMAS 3º PERÍODO 43

Pedro Vasconcelos DCC/FCUP. Programação Funcional 15 a Aula Árvores de pesquisa

Pesquisa: localização de um Registo num Ficheiro (para aceder ao registo: ler/alterar informação) R. P. António Viera, 23. R. Carlos Seixas, 9, 6º

Métodos de Pesquisa em Memória Primária

void ins_ele (ARV_BIN_BUSCA *arv, int v) { if (!(*arv)) maketree(arv, v); else if (v<info(*arv)) /* if (v<(*arv)->info) */ ins_ele(&((*arv)->left),

Copiar para o ficheiro ArvoreBinaria.h e adaptar as funções associadas às operações sobre árvores binárias (3.1 a 3.12)

DAS5102 Fundamentos da Estrutura da Informação

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

Algoritmos e Estruturas de Dados 2005/2006. árvore Vermelho-Preto cada nó tem no máximo 1 filho vermelho. Árvore AA ; semelhante a árvore BB, mas:

LEIC-FEUP 2001/2002 Algoritmos e Estruturas de Dados 1. Árvores-1

Algoritmos e Estrutura de Dados II. Árvore AVL. Prof Márcio Bueno. / Material da Prof a Ana Eliza

Exemplo Árvore Binária

Pesquisa digital. Algoritmos e Estruturas de Dados II

Árvore Binária de Busca. Algoritmos e Estrutura de Dados II. Operações Busca e Sucessor. Árvore Binária de Busca. Árvores Rubro-Negras

Pesquisa em memória primária

Estrutura de Dados e Algoritmos e Programação e Computadores II. Aula 4: Listas Estáticas e Dinâmicas

Árvores, Árvores Binárias e Árvores Binárias de Pesquisa. Rui Jorge Tramontin Jr.

Índice. Capítulo 2 Estrutura de Dados sequencial com armazenamento sequencial

Prova 2 PMR3201 1o. semestre 2015 Prof. Thiago Martins

Fila de Prioridade. Siang Wun Song - Universidade de São Paulo - IME/USP. MAC Estruturas de Dados

EAD Fila. - algumas operações realizam-se na frente/cabeça e outras na cauda da Fila

Introdução. Árvore B. CaracterísMcas. Origem do Nome. Exemplo. Grau. Rohit Gheyi. B vem de balanceamento

Exame de Admissão. Instituto Nacional de Pesquisas Espaciais 18 de setembro de 2018 A: GABARITO

a) a soma de dois números pares é par. b) a soma de dois números ímpares é par. c) a soma de um número par com um número ímpar é ímpar.

Árvore B. Uma Árvore B de ordem m éumaárvore,talque: Cada nó contém no máximo m

ÁRVORES ABB (ÁRVORES BINÁRIAS DE BUSCAS) Sérgio Carlos Portari Júnior

Árvores Trie e Patricia. Márcio Bueno ed2tarde@marciobueno.com / ed2noite@marciobueno.com

Busca em Memória. Secundária

Árvores Binárias de Busca

Transcrição:

Programação II Conhecida também como: Árvore binária ordenada Árvore binária de busca Aresenta relação de ordem entre os nodos Ordem definida através do camo chamado chave CHAVE Prof. Mateus Raeder Chaves dulicadas não são ermitidas Cada nó ossui uma chave única na árvore! Universidade do Vale do Rio dos Sinos - São Leooldo - Não há chaves dulicadas!!! FILHO DA ESQUERDA FILHO DA DIREITA Crie árvores inserindo os seguintes nós (em ordem): a), 22, 10,,, 15, 0, 22 b) j, x, o, m, z, a, j, h, i Valor da chave MENOR que a chave do ai Raiz Valor da chave MAIOR que a chave do ai a) b) j 22 a x 10 1 10 h o z 0 15 i m Classe Nodo Binário ublic class BSTNode { rotected int key; rotected BSTNode left, right; ublic BSTNode() { left = right = null; ublic BSTNode(int num) { this(num,null,null); ublic BSTNode(int num, BSTNode lt, BSTNode rt) { this.key = num; left = lt; right = rt; ublic int getkey() { return key; ublic void setkey(int key) { this.key = key; Classe Nodo Binário ublic BSTNode getleft() { return left; ublic void setleft(bstnode left) { this.left = left; ublic BSTNode getright() { return right; ublic void setright(bstnode right) { this.right = right; 1

Classe Árvore Binária de Pesquisa ublic class BST { rivate BSTNode root = null; ublic BST() { ublic void clear() { root = null; ublic boolean isemty() { return root == null; ublic BSTNode getrootnode (){ return root; Busca de valor A rocura de um valor em uma árvore binária é mais ráida do que em listas ou vetores. Como funciona: Para cada nó, comare a chave a ser localizada com o valor armazenado no nó correntemente aontado Se a chave for menor, vá ara a sub-árvore esquerda, e tente novamente Senão vá ara a sub-árvore direita, e tente novamente A busca ara quando: For encontrado o nó Ou quando não há mais meios de continuar, ois a chave não está na árvore ublic BSTNode search (int el) { Busca de valor rivate BSTNode search (BSTNode, int el) { while (!= null) { se valor rocurado == chave do nó, retorna referência ao nó if (el==.key) return ; se valor rocurado < chave do nó, rocurar na sub-árvore esquerda deste nó else if (el<.key) =.left; se valor rocurado > chave do nó, rocurar na sub-árvore direita deste nó else =.right; caso chave não foi achada, retorna null Exemlo de busca de valor ublic BSTNode search (int el) { rivate BSTNode search (BSTNode, int el) { while (!= null) { if (el==.key) return ; else if (el<.key) =.left; else =.right; 10 1 Exemlo de busca de valor Exemlo de busca de valor ublic BSTNode search (int el) { ublic BSTNode search (int el) { rivate BSTNode search (BSTNode, int el) { while (!= null) { if (el==.key) return ; else if (el<.key) =.left; else =.right; 10 1 rivate BSTNode search (BSTNode, int el) { while (!= null) { if (el==.key) return ; else if (el<.key) =.left; else =.right; 10 1 2

Exemlo de busca de valor Exemlo de busca de valor ublic BSTNode search (int el) { ublic BSTNode search (int el) { rivate BSTNode search (BSTNode, int el) { while (!= null) { if (el==.key) return ; else if (el<.key) =.left; else =.right; 10 1 rivate BSTNode search (BSTNode, int el) { while (!= null) { if (el==.key) return ; else if (el<.key) =.left; else =.right; 10 1 Exemlo de busca de valor Exemlo de busca de valor ublic BSTNode search (int el) { ublic BSTNode search (int el) { rivate BSTNode search (BSTNode, int el) { while (!= null) { if (el==.key) return ; else if (el<.key) =.left; else =.right; 10 1 rivate BSTNode search (BSTNode, int el) { while (!= null) { if (el==.key) return ; else if (el<.key) =.left; else =.right; 10 1 Exemlo de busca de valor Exemlo de busca de valor ublic BSTNode search (int el) { ublic BSTNode search (int el) { rivate BSTNode search (BSTNode, int el) { while (!= null) { if (el==.key) return ; else if (el<.key) =.left; else =.right; 10 1 rivate BSTNode search (BSTNode, int el) { while (!= null) { if (el==.key) return ; else if (el<.key) =.left; else =.right; 10 1 3

Exemlo de busca de valor Exemlo de busca de valor ublic BSTNode search (int el) { ublic BSTNode search (int el) { rivate BSTNode search (BSTNode, int el) { while (!= null) { if (el==.key) return ; else if (el<.key) =.left; else =.right; 10 1 rivate BSTNode search (BSTNode, int el) { while (!= null) { if (el==.key) return ; else if (el<.key) =.left; else =.right; 10 1 Exemlo de busca de valor Exemlo de busca de valor ublic BSTNode search (int el) { ublic BSTNode search (int el) { rivate BSTNode search (BSTNode, int el) { while (!= null) { if (el==.key) return ; else if (el<.key) =.left; else =.right; 10 1 rivate BSTNode search (BSTNode, int el) { while (!= null) { if (el==.key) return ; else if (el<.key) =.left; else =.right; 10 1 Exemlo de busca de valor ublic BSTNode search (int el) { rivate BSTNode search (BSTNode, int el) { while (!= null) { if (el==.key) return ; else if (el<.key) =.left; else =.right; 10 1 Inserindo uma nova chave ublic boolean insert (int el) { BSTNode = root, rev = null; caso o valor já exista na árvore, não inserir e retornar false rocurando um lugar ara colocar o novo nó while (!= null) { rev = ; if (el<.key) =.left; else =.right; se árvore vazia else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el);

Exemlo de inserção Exemlo de inserção ublic boolean insert (int el) { BSTNode = root, rev = null; while (!= null) { rev = ; if (el<.key) =.left; else =.right; else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el); rev el = ublic boolean insert (int el) { BSTNode = root, rev = null; while (!= null) { rev = ; if (el<.key) =.left; else =.right; else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el); rev el = Exemlo de inserção Exemlo de inserção ublic boolean insert (int el) { BSTNode = root, rev = null; while (!= null) { rev = ; if (el<.key) =.left; else =.right; else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el); rev el = ublic boolean insert (int el) { BSTNode = root, rev = null; while (!= null) { rev = ; if (el<.key) =.left; else =.right; else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el); rev el = Exemlo de inserção Exemlo de inserção ublic boolean insert (int el) { BSTNode = root, rev = null; while (!= null) { rev = ; if (el<.key) =.left; else =.right; else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el); rev el = ublic boolean insert (int el) { BSTNode = root, rev = null; while (!= null) { rev = ; if (el<.key) =.left; else =.right; else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el); el = 23 5

Exemlo de inserção Exemlo de inserção ublic boolean insert (int el) { BSTNode = root, rev = null; while (!= null) { rev = ; if (el<.key) =.left; else =.right; else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el); rev el = 23 ublic boolean insert (int el) { BSTNode = root, rev = null; while (!= null) { rev = ; if (el<.key) =.left; else =.right; else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el); rev el = 23 Exemlo de inserção Exemlo de inserção ublic boolean insert (int el) { BSTNode = root, rev = null; while (!= null) { rev = ; if (el<.key) =.left; else =.right; else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el); rev el = 23 ublic boolean insert (int el) { BSTNode = root, rev = null; while (!= null) { rev = ; if (el<.key) =.left; else =.right; else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el); rev el = 23 Exemlo de inserção Exemlo de inserção ublic boolean insert (int el) { BSTNode = root, rev = null; while (!= null) { rev = ; if (el<.key) =.left; else =.right; else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el); rev el = 23 ublic boolean insert (int el) { BSTNode = root, rev = null; while (!= null) { rev = ; if (el<.key) =.left; else =.right; else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el); rev el = 23 6

Exemlo de inserção Exemlo de inserção ublic boolean insert (int el) { BSTNode = root, rev = null; while (!= null) { rev = ; if (el<.key) =.left; else =.right; else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el); rev el = 23 ublic boolean insert (int el) { BSTNode = root, rev = null; while (!= null) { rev = ; if (el<.key) =.left; else =.right; else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el); rev el = 23 Exemlo de inserção Exemlo de inserção ublic boolean insert (int el) { BSTNode = root, rev = null; while (!= null) { rev = ; if (el<.key) =.left; else =.right; else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el); el = 23 rev 23 ublic boolean insert (int el) { BSTNode = root, rev = null; while (!= null) { rev = ; if (el<.key) =.left; else =.right; else if (rev.key<el) rev.right = new BSTNode(el); else rev.left = new BSTNode(el); el = 23 rev 23 É o rocesso de visitar cada nó da árvore exatamente uma vez. Visitar: Fazer algo com o nó como exibi-lo, gravá-lo, etc. O ercurso ode ser interretado como colocar todos os nós em uma linha ou a linearização da árvore. Os ercursos odem ser em extensão ou em rofundidade. Percursos em extensão: visitam todos os nós de cada nível, nível or nível (indo do mais alto ao mais baixo, ou vice-versa). Percursos em rofundidade: ercorre os caminhos das árvores. Percorre rimeiramente todo o caminho mais a esquerda, e assim or diante. - ercorre a sub-árvore direita. ré-fixada ós-fixada 7

ré-fixada ré-fixada ré-fixada ré-fixada ré-fixada ré-fixada 3 3

ré-fixada ré-fixada ré-fixada ré-fixada ré-fixada ré-fixada 6 - Percorre 3 esquerda 7 9

ré-fixada ré-fixada 6 6 ré-fixada ré-fixada ré-fixada ré-fixada ré-ordem: 10

ós-fixada ós-fixada ós-fixada ós-fixada 3 3 ós-fixada ós-fixada 3 3 11

ós-fixada ós-fixada ós-fixada ós-fixada ós-fixada ós-fixada 6 - Percorre 3 direita 7 - Percorre 3 direita 7

ós-fixada ós-fixada 6 6 ós-fixada ós-fixada ós-fixada ós-fixada 13

ós-fixada ós-fixada ós-ordem: - ercorre a sub-árvore direita. - ercorre a sub-árvore direita. 3 - ercorre a sub-árvore direita. - ercorre a sub-árvore direita. 3 3 1

- ercorre a sub-árvore direita. - ercorre a sub-árvore direita. 3 3 - ercorre a sub-árvore direita. - ercorre a sub-árvore direita. 3 7 3 7 - ercorre a sub-árvore direita. - ercorre a sub-árvore direita. 3 7 3 7 15

- ercorre a sub-árvore direita. - ercorre a sub-árvore direita. 3 7 3 7 - ercorre a sub-árvore direita. - ercorre a sub-árvore direita. 3 7 6 3 7 6 - Visita 3 o nó 7 - Visita 3 o nó 7 - ercorre a sub-árvore direita. - ercorre a sub-árvore direita. 3 7 6 3 7 6 16

- ercorre a sub-árvore direita. - ercorre a sub-árvore direita. 3 7 6 3 7 6 10 - ercorre a sub-árvore direita. - ercorre a sub-árvore direita. 3 7 6 10 3 7 6 10 - ercorre a sub-árvore direita. - ercorre a sub-árvore direita. 3 7 6 10 in-ordem: 3 7 6 10 17

Percorra cada uma das árvores abaixo em PÓS-, PRÉ- e IN-ORDEM: a) b) c) 30 50 7 10 30 Resostas: a) PÓS-ORDEM: 30 - - 50-6 - 65-70 - - PRÉ-ORDEM: - - 30 - - 50-70 - 65-6 IN-ORDEM: - 30 - - 50 - - 65-6 - 70 b) PÓS-ORDEM: 5-52 - 5-50 - 7 - - PRÉ-ORDEM: - - 50-5 - 5-52 - 7 IN-ORDEM: - 5-50 - 52-5 - - 7 65 5 5 17 c) PÓS-ORDEM: 5-9 - - 13-17 - 10-30 - - PRÉ-ORDEM: - - 10 - - 5-9 - 17-13 - 30 IN-ORDEM: 5 - - 9-10 - 13-17 - - 30-6 52 5 9 13 PRÉ-ORDEM - ercorre esquerda; - ercorre direita; PÓS-ORDEM IN-ORDEM PRÉ-ORDEM PÓS-ORDEM IN-ORDEM - ercorre esquerda; - ercorre esquerda; - ercorre esquerda; - ercorre esquerda; - ercorre direita; - ercorre esquerda; - ercorre direita; - visita Programação o nó; II Prof. Mateus - ercorre Raeder direita. - ercorre direita; - visita Programação o nó; II Prof. Mateus - ercorre Raeder direita. IN-ORDEM PRÉ-ORDEM ublic void inorder() { inorder(root); ublic void reorder() { reorder(root); IN-ORDEM - ercorre esquerda; - ercorre direita. rivate void inorder (BSTNode ) { if (!= null) { inorder(.left); System.out.rint(.key " "); inorder(.right); PRÉ-ORDEM - ercorre esquerda; - ercorre direita; rivate void reorder(bstnode ) { if (!= null) { System.out.rint(.key " "); reorder(.left); reorder(.right); PÓS-ORDEM ublic void ostorder() { ostorder(root); Remoção de um nó Ao remover um nó, 3 situações odem ocorrer : Situação 1: Exclusão de uma folha O nó é uma folha e não tem filhos o onteiro do seu ai é ajustado ara nulo. PÓS-ORDEM - ercorre esquerda; - ercorre direita; rivate void ostorder(bstnode ) { if (!= null) { ostorder(.left); ostorder(.right); System.out.rint(.key " "); Nodo a ser excluído 10 30 30 1

Remoção de um nó Ao remover um nó, 3 situações odem ocorrer : Situação 2: Nodo tem um filho Ponteiro do ai aonta ara o filho deste nodo Remoção de um nó Ao remover um nó, 3 situações odem ocorrer : Situação 3: Nodo tem dois filhos Dois tios de remoção Por cóia Por fusão Nodo a ser excluído Nodo a ser excluído 30 30 10 30 Remoção or cóia Remoção or cóia Remove uma chave X (chave do nó que se quer remover): sobrescrevendo-a or uma outra chave Y Y é o maior valor na sub-árvore esquerda, ois este vai ser maior que todos os valores da sub-árvore esquerda e ao mesmo temo menor que os valores da sub-árvore direita e então removendo o nó que contem Y que será um dos casos simles: folha, ou nó com aenas um filho 1 10 30 2 10 30 Coia 55 55 52 52 56 Maior valor da sub-árvore esquerda 56 3 10 30 Remoção or cóia 55 52 Final 55 52 56 Deleta nodo (situação 1 ou 2) 56 Encontra o ai de um nodo rotected BSTNode searchfather (int el) { BSTNode = root; BSTNode rev = null; acha o nó com a chave el while (!= null &&!(.key==el)) { rev = ; if (.key < el) =.right; else =.left; if (!=null &&.key==el) return rev; 19

Exemlo de encontro de ai Exemlo de encontro de ai rotected BSTNode searchfather (int el) { BSTNode = root; BSTNode rev = null; acha o nó com a chave el while (!= null &&!(.key==el)) { rev = ; if (.key < el) =.right; else =.left; if (!=null &&.key==el) return rev; rotected BSTNode searchfather (int el) { BSTNode = root; BSTNode rev = null; acha o nó com a chave el while (!= null &&!(.key==el)) { rev = ; if (.key < el) =.right; else =.left; if (!=null &&.key==el) return rev; rev Exemlo de encontro de ai Exemlo de encontro de ai rotected BSTNode searchfather (int el) { BSTNode = root; BSTNode rev = null; acha o nó com a chave el while (!= null &&!(.key==el)) { rev = ; if (.key < el) =.right; else =.left; if (!=null &&.key==el) return rev; rev rotected BSTNode searchfather (int el) { BSTNode = root; BSTNode rev = null; acha o nó com a chave el while (!= null &&!(.key==el)) { rev = ; if (.key < el) =.right; else =.left; if (!=null &&.key==el) return rev; rev Exemlo de encontro de ai Exemlo de encontro de ai rotected BSTNode searchfather (int el) { BSTNode = root; BSTNode rev = null; acha o nó com a chave el while (!= null &&!(.key==el)) { rev = ; if (.key < el) =.right; else =.left; if (!=null &&.key==el) return rev;? Sim rev rotected BSTNode searchfather (int el) { BSTNode = root; BSTNode rev = null; acha o nó com a chave el while (!= null &&!(.key==el)) { rev = ; if (.key < el) =.right; else =.left; if (!=null &&.key==el) return rev; rev

Exemlo de encontro de ai Exemlo de encontro de ai rotected BSTNode searchfather (int el) { BSTNode = root; BSTNode rev = null; acha o nó com a chave el while (!= null &&!(.key==el)) { rev = ; if (.key < el) =.right; else =.left; if (!=null &&.key==el) return rev; rev rotected BSTNode searchfather (int el) { BSTNode = root; BSTNode rev = null; acha o nó com a chave el while (!= null &&!(.key==el)) { rev = ; if (.key < el) =.right; else =.left; if (!=null &&.key==el) return rev; rev Exemlo de encontro de ai Exemlo de encontro de ai rotected BSTNode searchfather (int el) { BSTNode = root; BSTNode rev = null; acha o nó com a chave el while (!= null &&!(.key==el)) { rev = ; if (.key < el) =.right; else =.left; if (!=null &&.key==el) return rev; rev rotected BSTNode searchfather (int el) { BSTNode = root; BSTNode rev = null; acha o nó com a chave el while (!= null &&!(.key==el)) { rev = ; if (.key < el) =.right; else =.left; if (!=null &&.key==el) return rev;? Não rev Exemlo de encontro de ai Exemlo de encontro de ai rotected BSTNode searchfather (int el) { BSTNode = root; BSTNode rev = null; acha o nó com a chave el while (!= null &&!(.key==el)) { rev = ; if (.key < el) =.right; else =.left; if (!=null &&.key==el) return rev; rev rotected BSTNode searchfather (int el) { BSTNode = root; BSTNode rev = null; acha o nó com a chave el while (!= null &&!(.key==el)) { rev = ; if (.key < el) =.right; else =.left; if (!=null &&.key==el) return rev; rev 21

Exemlo de encontro de ai Exemlo de encontro de ai rotected BSTNode searchfather (int el) { BSTNode = root; BSTNode rev = null; acha o nó com a chave el while (!= null &&!(.key==el)) { rev = ; if (.key < el) =.right; else =.left; if (!=null &&.key==el) return rev; rev rotected BSTNode searchfather (int el) { BSTNode = root; BSTNode rev = null; acha o nó com a chave el while (!= null &&!(.key==el)) { rev = ; if (.key < el) =.right; else =.left; if (!=null &&.key==el) return rev; rev Exemlo de encontro de ai rotected BSTNode searchfather (int el) { BSTNode = root; BSTNode rev = null; acha o nó com a chave el while (!= null &&!(.key==el)) { rev = ; if (.key < el) =.right; else =.left; if (!=null &&.key==el) return rev; 10 30 rev Remoção or cóia ublic void deletebycoying (int el) { BSTNode node, father = null; node = search (el) ; rocura nó a ser deletado if (node!= null && node.key==el) { if (node!=root) father = searchfather (el); rocura ai 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 or cóia BSTNode tm = node.left; 1. egando sub-arvore esquerda while (tm.right!= null) 2. acha a osição mais a direita da sub-árvore esquerda do nó tm = tm.right; deletebycoying (tm.key); remove or coia o nó que ossui o maior valor da sub-arvore esquerda do nó a ser deletado node.key = tm.key; coia valor da chave do maior nó da sub-árvore esquerda else if (root!= null) System.out.rintln("el " el " is not in the tree"); else System.out.rintln("the tree is emty"); Exemlo de remoção or cóia ublic void deletebycoying (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 tm = node.left; while (tm.right!= null) tm = tm.right; deletebycoying (tm.key); node.key = tm.key; 10 30 else if (root!= null) System.out.rintln("el " el " is not in the tree"); else System.out.rintln("the tree is emty"); 55 52 Remoção or 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ó assa a ser ai da sub-árvore direita do nó a ser removido Remove a chave, removendo o nó que contém a chave E o ai do nó removido assa a aontar ara a nova subárvore 56 22

1 Remoção or fusão 2 3 Remoção or fusão Final 50 10 30 10 30 10 30 50 10 30 55 55 55 Passa a ser ai 55 52 52 52 52 56 70 56 Maior valor da sub-árvore esquerda 56 56 70 Remoção or fusão ublic void deletebymerging (int el) { BSTNode tm, node,father = null; node = search (el) ; rocura nó a ser deletado if (node!= null && node.key==el) { if (node!=root) father = searchfather (el); rocura ai 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; Exemlo de remoção or fusão ublic void deletebymerging (int el) { BSTNode tm, 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 { se tem dois filhos, faz deleção or fusão else { tm = node.left; ega sub-arvore esquerda tm = node.left; while (tm.right!= null) tm = tm.right; ega filho mais a direita da sub-arvore esquerda while (tm.right!= null) tm = tm.right; 55 tm.right = node.right; filho a direita da sub-arvore esquerda assa a ter tm.right = node.right; como filho direito o filho direito do nó a ser deletado if (root==node) root = node.left; if (root==node) root = node.left; else if (father.left == node) father.left = node.left; else if (father.left == node) father.left = node.left; else father.right = node.left; else father.right = node.left; 52 else if (root!= null) System.out.rintln("el " el " is not in the tree"); else if (root!= null) System.out.rintln("el " el " is not in the tree"); else System.out.rintln("the tree is emty"); else System.out.rintln("the tree is emty"); 56 23