Prévia do material em texto
Luca de Paula Nascimento Lima RA: 140427 AULA 6: Exercício teórico métodos de pesquisa 1) (0,4) Suponha que nós com chaves {50, 30, 70, 20 40, 60, 80, 15, 25, 35, 45, 36} são inseridos nesta ordem em uma árvore binária. a) Desenhe a árvore resultante. b) Em seguida, remova o nó 30 e mostre a nova árvore. 2) (0,3) A operação de eliminação é comutativa, ie, a eliminação de x e depois y resulta na mesma árvore que a eliminação de y e depois x? Mostre um contra- exemplo. R: temos a árvore (15(5()(10()()))30()()), se removermos primeiro o 15, se o algoritmo buscar primeiro o nó mais à direita da subárvore da esquerda, o y vai tomar o seu lugar ficando (10(5)(30)), depois tirando o 10 teremos (5()(30()())) ou (30(5()())()), porém se buscarmos primeiro o nó mais à esquerda da subárvore à direita chegaremos no resultado (30(5()(10()())()) e tirando o 10 ficaremos com (30(5()())()) agora se tirarmos o 10 primeiro ficaremos com (15(5()())(30()()), e depois tirando o 15 ficaremos com (5()(30()())) ou (30)(5()())()). 3) (0,3) No slide 16 foi apresentado um algoritmo de remoção da raiz em uma árvore binária de busca. Escreva um algoritmo de remoção completo em árvore binária, ie, para remover qualquer elemento da árvore. Explique os passos/lógica do algoritmo. R: int remove_ArvBin(ArvBin *raiz, int valor){ if(raiz==NULL) return 0; struct NO* ant = NULL struct NO* atual =*raiz; while(atual != NULL){ if(valor==atual->info){ *raiz = remove_atual(atual); else{ if(ant->dir == atual) ant->dir = remove_atual(atual); else ant->esq = remove_atual(atual); } return 1 } ant =atual; if(valor > atual->info) atual = atual->dir; else atual = atual->esq; } struct NO* remove_atual(struct NO* atual){ struct NO *no1, *no2; if(atual->esq == NULL){ no2 = atual->dir; free(atual); return no2; } no1 = atual; no2 = atual->esq; while(no2->dir != NULL){ no1 = no2; no2 = no2->dir; } if(no1 != atual){ no1->dir = no2->esq; no2->esq = atual->esq; } no2->dir = atual->dir; free(atual); return no2; }