Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- struct No {
- int numero;
- struct No *esquerda;
- struct No *direita;
- };
- typedef struct No No;
- void criarArvore(No **pRaiz) {
- *pRaiz = NULL;
- }
- void inserir(No **pRaiz, int numero) {
- if(*pRaiz == NULL) {
- *pRaiz = (No *) malloc(sizeof(No));
- (*pRaiz)->esquerda = NULL;
- (*pRaiz)->direita = NULL;
- (*pRaiz)->numero = numero;
- }else{
- if(numero < (*pRaiz)->numero)
- inserir(&(*pRaiz)->esquerda, numero);
- if(numero > (*pRaiz)->numero)
- inserir(&(*pRaiz)->direita, numero);
- }
- }
- No *MaiorDireita(No **no){
- if((*no)->direita != NULL)
- return MaiorDireita(&(*no)->direita);
- else{
- No *aux = *no;
- if((*no)->esquerda != NULL) // se nao houver essa verificacao, esse nó vai perder todos os seus filhos da esquerda!
- *no = (*no)->esquerda;
- else
- *no = NULL;
- return aux;
- }
- }
- No *MenorEsquerda(No **no){
- if((*no)->esquerda != NULL)
- return MenorEsquerda(&(*no)->esquerda);
- else{
- No *aux = *no;
- if((*no)->direita != NULL) // se nao houver essa verificacao, esse nó vai perder todos os seus filhos da direita!
- *no = (*no)->direita;
- else
- *no = NULL;
- return aux;
- }
- }
- void remover(No **pRaiz, int numero){
- if(*pRaiz == NULL){ // esta verificacao serve para caso o numero nao exista na arvore.
- printf("Numero nao existe na arvore!");
- return;
- }
- if(numero < (*pRaiz)->numero)
- remover(&(*pRaiz)->esquerda, numero);
- else
- if(numero > (*pRaiz)->numero)
- remover(&(*pRaiz)->direita, numero);
- else{ // se nao eh menor nem maior, logo, eh o numero que estou procurando! :)
- No *pAux = *pRaiz; // quem programar no Embarcadero vai ter que declarar o pAux no inicio do void! :[
- if (((*pRaiz)->esquerda == NULL) && ((*pRaiz)->direita == NULL)){ // se nao houver filhos...
- free(pAux);
- (*pRaiz) = NULL;
- }
- else{ // so tem o filho da direita
- if ((*pRaiz)->esquerda == NULL){
- (*pRaiz) = (*pRaiz)->direita;
- pAux->direita = NULL;
- free(pAux); pAux = NULL;
- }
- else{ //so tem filho da esquerda
- if ((*pRaiz)->direita == NULL){
- (*pRaiz) = (*pRaiz)->esquerda;
- pAux->esquerda = NULL;
- free(pAux); pAux = NULL;
- }
- else{ //Escolhi fazer o maior filho direito da subarvore esquerda.
- pAux = MaiorDireita(&(*pRaiz)->esquerda); //se vc quiser usar o Menor da esquerda, so o que mudaria seria isso:
- pAux->esquerda = (*pRaiz)->esquerda; // pAux = MenorEsquerda(&(*pRaiz)->direita);
- pAux->direita = (*pRaiz)->direita;
- (*pRaiz)->esquerda = (*pRaiz)->direita = NULL;
- free((*pRaiz)); *pRaiz = pAux; pAux = NULL;
- }
- }
- }
- }
- }
- void exibirEmOrdem(No *pRaiz){
- if(pRaiz != NULL){
- exibirEmOrdem(pRaiz->esquerda);
- printf("\n%i", pRaiz->numero);
- exibirEmOrdem(pRaiz->direita);
- }
- }
- void exibirPreOrdem(No *pRaiz){
- if(pRaiz != NULL){
- printf("\n%i", pRaiz->numero);
- exibirPreOrdem(pRaiz->esquerda);
- exibirPreOrdem(pRaiz->direita);
- }
- }
- void exibirPosOrdem(No *pRaiz){
- if(pRaiz != NULL){
- exibirPosOrdem(pRaiz->esquerda);
- exibirPosOrdem(pRaiz->direita);
- printf("\n%i", pRaiz->numero);
- }
- }
- int contarNos(No *pRaiz){
- if(pRaiz == NULL)
- return 0;
- else
- return 1 + contarNos(pRaiz->esquerda) + contarNos(pRaiz->direita);
- }
- int contarFolhas(No *pRaiz){
- if(pRaiz == NULL)
- return 0;
- if(pRaiz->esquerda == NULL && pRaiz->direita == NULL)
- return 1;
- return contarFolhas(pRaiz->esquerda) + contarFolhas(pRaiz->direita);
- }
- int maior(int a, int b){
- if(a > b)
- return a;
- else
- return b;
- }
- int altura(No *pRaiz){
- if((pRaiz == NULL) || (pRaiz->esquerda == NULL && pRaiz->direita == NULL))
- return 0;
- else
- return 1 + maior(altura(pRaiz->esquerda), altura(pRaiz->direita));
- }
- int main(int argc, char const *argv[]) {
- No **arvore;
- criarArvore(arvore);
- inserir(arvore, 7);
- inserir(arvore, 10);
- inserir(arvore, 3);
- inserir(arvore, 6);
- inserir(arvore, 1);
- inserir(arvore, 20);
- inserir(arvore, 30);
- inserir(arvore, 40);
- inserir(arvore, 50);
- inserir(arvore, 60);
- exibirEmOrdem(*arvore);
- printf("\n\n");
- exibirPosOrdem(*arvore);
- printf("\n\n");
- exibirPreOrdem(*arvore);
- printf("\n\n");
- return 0;
- }
Add Comment
Please, Sign In to add comment