Funções de Árvores Binárias em C++

Classificado em Educação Artística

Escrito em em português com um tamanho de 4,7 KB.

Funções de Árvores Binárias em C++

Este código exemplifica algumas funções básicas para manipulação de árvores binárias em C++.

Código

#include <stdio.h>
#include <conio.h>

// Declaração da estrutura do nó

typedef struct no {
  int info;
  struct no *dir, *esq;
};

// Função para criar um nó

no * cria_no(int x) {
  no *p;
  p = new no;
  p->info = x;
  p->esq = p->dir = NULL;
  return(p);
}

// Função para inserir um nó na Árvore Binária de Busca (ABB)

void insere_ABB(no ** pos, int x) {
  if (*pos == NULL) {
    *pos = cria_no(x);
    return;
  }
  if (x < (*pos)->info) {
    insere_ABB(&((*pos)->esq), x);
  } else {
    if (x > (*pos)->info) {
      insere_ABB(&((*pos)->dir), x);
    } else {
      printf("%d já estava inserido na árvore \n", x);
    }
  }
}

// Função de impressão em ordem

void inorder(no *p) {
  if (p != NULL) {
    inorder(p->esq);
    printf(" %d ", p->info);
    inorder(p->dir);
  }
}

// Função que verifica se um elemento está cadastrado ou não na árvore

int busca_ABB(no * pos, int x) {
  if (pos == NULL) {
    return(0);
  }
  if (x == pos->info) {
    return(1);
  }
  if (x < pos->info) {
    return(busca_ABB(pos->esq, x));
  } else {
    if (x > pos->info) {
      return(busca_ABB(pos->dir, x));
    }
  }
}

// Função que recebe um elemento de uma árvore e retorna o seu nível.

int nivel_ABB(no *pos, int x, int nivel) {
  if (pos == NULL) {
    return(-1);
  }
  if (x == pos->info) {
    return(nivel);
  }
  if (x < pos->info) {
    return(nivel_ABB(pos->esq, x, nivel + 1));
  } else {
    if (x > pos->info) {
      return(nivel_ABB(pos->dir, x, nivel + 1));
    }
  }
}

// Função que recebe a raiz de uma árvore binária e informa se ela é binária de busca.

int testa_ABB(no * pos) {
  int arvesq = 1, arvdir = 1;
  if (pos == NULL) {
    return(1);
  }
  if ((pos->esq == NULL) && (pos->dir == NULL))
    return(1);
  if (pos->esq != NULL) {
    if (pos->info < pos->esq->info) {
      return(0);
    } else {
      arvesq = testa_ABB(pos->esq);
    }
  }
  if (pos->dir != NULL) {
    if (pos->info > pos->dir->info) {
      return(0);
    } else {
      arvdir = testa_ABB(pos->dir);
    }
  }
  if ((arvdir == 0) || (arvesq == 0))
    return(0);
  else
    return(1);
}

// Função que recebe a raiz de uma árvore binária e imprime todos os nós folha.

void imprime_folhas(no *pos) {
  if (pos == NULL) {
    printf("Árvore vazia");
    return;
  }
  if ((pos->esq == NULL) && (pos->dir == NULL)) {
    printf(" %d ", pos->info);
  } else {
    if (pos->esq != NULL) {
      imprime_folhas(pos->esq);
    }
    if (pos->dir != NULL) {
      imprime_folhas(pos->dir);
    }
  }
}

// Função que recebe a raiz de uma árvore binária e imprime todos os nós não folha.

void imprime_nao_folhas(no *pos) {
  if (pos == NULL) {
    printf("Árvore vazia");
    return;
  }
  if ((pos->esq != NULL) || (pos->dir != NULL)) {
    printf(" %d ", pos->info);
  }
  if (pos->esq != NULL) {
    imprime_nao_folhas(pos->esq);
  }
  if (pos->dir != NULL) {
    imprime_nao_folhas(pos->dir);
  }
}

// Função que recebe a raiz de uma árvore binária e imprime todos os nós com o respectivo nível

void imprime_nivel(no *pos, int nivel) {
  if (pos == NULL) {
    printf("arvore vazia\n");
    return;
  }
  printf("%d nível %d \n", pos->info, nivel);
  if (pos->esq != NULL)
    imprime_nivel(pos->esq, nivel + 1);
  if (pos->dir != NULL)
    imprime_nivel(pos->dir, nivel + 1);
}

}

Entradas relacionadas: