Considere
as
seguintes
declarações
(NodoABP
e
PNodoABP),
adaptadas
dos
apontamentos:
struct NodoArv {
int Elemento;
struct NodoArv *Esquerda;
struct NodoArv *Direita;
};
typedef struct NodoArv *PNodoArv;
Copiar para o ficheiro “ArvoreBinariaPesquisa.h” e adaptar as funções associadas às
operações sobre árvores binárias de pesquisa que constam nos apontamentos.
1) Implementar uma função para construir uma ABP T com valores inteiros positivos,
inseridos a partir do teclado, usando a função InserirABP (consta dos apontamentos).
PNodoArv ConstruirArvoreABP () {
int X;
PNodoArv T;
T = CriarArvore();
printf(“Inserir um inteiro positivo não nulo (negativo para terminar): \n”);
scanf(“%d”, &X);
while (X > 0) {
T = InserirABP(X, T);
printf(“Inserir um inteiro positivo (negativo para terminar): \n”);
}
scanf(“%d”, &X);
return T;
}
2) ...
3) Usando a definição de ABP de inteiros em cima, implemente uma função que dada
uma ABP T, determine o maior elemento de T.
Nota: o maior elemento encontra-se no nodo mais à direita da árvore (não vazia).
int MaiorElementoABP (PNodoArv T) {
if (T->Direita == NULL)
return T->Elemento;
return MaiorElementoABP(T->Direita);
}
4) Usando a definição de ABP de inteiros em cima, implemente uma função que dada
uma ABP T, determine o menor elemento de T.
Nota: o menor elemento encontra-se no nodo mais à esquerda da árvore (não vazia).
int MenorElementoABP (PNodoArv T) {
if (T->Esquerda == NULL)
return T->Elemento;
return MenorElementoABP(T->Esquerda);
}
Programa principal:
#include <stdio.h>
#include <stdlib.h>
#include “ArvoreBinariaPesquisa.h” // deve estar na diretoria/pasta do main
main () {
PNodoABP T;
int maior, menor;
T = ConstruirArvoreABP();
ListarPorNiveis(T);
maior = MaiorElementoABP(T);
menor = MenorElementoABP(T);
printf(“Maior e menor elementos são: %d, %d\n”, maior, menor);
}
5) Usando a definição de ABP de inteiros em cima, implemente uma função que dada
uma ABP T, determine a soma dos elementos de T superiores a uma dada chave K.
int SomaElementosMaioresK (PNodoArv T, int K) {
int se, sd;
if (T == NULL)
return 0;
if (T->Elemento > K) {
se = SomaElementosMaioresK(T->Esquerda, K);
sd = SomaElementosMaioresK(T->Direita, K);
return (T->Elemento + se + sd);
}
else {
sd = SomaElementosMaioresK(T->Direita, K);
}
}
return sd;
Programa principal:
#include <stdio.h>
#include <stdlib.h>
#include “ArvoreBinariaPesquisa.h” // deve estar na diretoria/pasta do main
main () {
PNodoArv T;
int Num, soma, k;
T = ConstruirArvoreABP();
ListarPorNivel(T);
maior = MaiorElementoABP(T);
menor = MenorElementoABP(T);
printf(“Maior e menor elementos são: %d, %d\n”, maior, menor);
printf(“Insira um valor inteiro: “);
scanf(“%d”, &k);
soma = SomaElementosMaioresK(T, k);
printf(“Soma dos elementos maiores que %d: %d\n”, k, soma);
}
6) Usando a definição de ABP de inteiros em cima, implemente uma função que dada
uma ABP T, determine o número de elementos de T que são superiores a uma dada chave
(valor inteiro) K.
int NumeroElementosMaioresK (PNodoArv T, int K) {
int se, sd;
if (T == NULL)
return 0;
if (T->Elemento > K) {
se = NumeroElementosMaioresK(T->Esquerda, K);
sd = NumeroElementosMaioresK(T->Direita, K);
return (1 + se + sd);
}
else {
sd = NumeroElementosMaioresK(T->Direita, K);
return sd;
}
}
Programa principal:
#include <stdio.h>
#include <stdlib.h>
#include “ArvoreBinaria-esquisa.h” // deve estar na diretoria/pasta do main
main () {
PNodoArv T;
int Num, soma, k, Num;
T = ConstruirArvoreABP();
ListarPorNivel(T);
maior = MaiorElementoABP(T);
menor = MenorElementoABP(T);
printf(“Maior e menor elementos são: %d, %d\n”, maior, menor);
printf(“Insira um valor inteiro: “);
scanf(“%d”, &k);
soma = SomaElementosMaioresK(T, k);
printf(“Soma dos elementos maiores que %d: %d\n”, k, soma);
Num = NumeroElementosMaioresK(T, k);
printf(“Número de elementos maiores que %d: %d\n”, k, Num);
}
7) Usando a definição de ABP de inteiros em cima, implemente uma função que dada
uma ABP T e uma chave K, devolva a chave seguinte a K na ordem crescente.
Nota: a chave seguinte de K encontra-se no nodo mais à esquerda da subárvore direita
do nodo com a chave K.
int ChaveSeguinteK (PNodoArv T, int K) {
if (T->Elemento == K) { // procurar o nodo mais à esquerda da subárvore direita
if (T->Direita == NULL)
return -1; // K é a chave com maior valor (não existe seguinte)
return MenorElemento(T->Direita);
}
if (K > T->Elemento)
return ChaveSeguinteK(T->Direita, K);
return ChaveSeguinteK(T->Esquerda, K);
}
Programa principal:
#include <stdio.h>
#include <stdlib.h>
#include “ArvoreBinariaPesquisa.h” // deve estar na diretoria/pasta do main
main () {
PNodoArv T;
int Num, soma, k, Num, ChaveSeg;
T = ConstruirArvoreABP();
ListarPorNivel(T);
maior = MaiorElementoABP(T);
menor = MenorElementoABP(T);
printf(“Maior e menor elementos são: %d, %d\n”, maior, menor);
printf(“Insira um valor inteiro: “);
scanf(“%d”, &k);
soma = SomaElementosMaioresK(T, k);
printf(“Soma dos elementos maiores que %d: %d\n”, k, soma);
Num = NumeroElementosMaioresK(T, k);
printf(“Número de elementos maiores que %d: %d\n”, k, Num);
ChaveSeg = ChaveSeguinte(T, k);
printf(“A chave seguinte a %d é: %d\n”, k, ChaveSeg);
}
Download

Considere as seguintes declarações (NodoABP e PNodoABP