#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int info;
struct node *dir, *esq;
} no;
void criarArvore(no **raiz){
*raiz = NULL;
}
void inserir(no **pRaiz,int info){
if (*pRaiz==NULL){
*pRaiz = (no *) malloc(sizeof(no));
(*pRaiz)->esq = NULL;
(*pRaiz)->dir = NULL;
(*pRaiz)->info = info;
}else{
if(info<(*pRaiz)->info){
inserir(&(*pRaiz)->esq,info);
}
if(info>(*pRaiz)->info){
inserir(&(*pRaiz)->dir,info);
}
}
int h = altura(&pRaiz)
while (h<-1||h>1){
if (h<-1){
if (altura((*pRaiz)->esq)<0){
rot_dir(&pRaiz);
}else{
rot_esq_dir(&pRaiz);
}
}
if (h>1){
if (altura((*pRaiz)->dir)>0){
rot_esq(&pRaiz);
}else{
rot_dir_esq(&pRaiz);
}
}
h = altura(&pRaiz)
}
}
void remover(no **pRaiz,int info){
if (*pRaiz==NULL){
printf("\nNao existe o valor a ser removido.");
return;
}else{
if(info<(*pRaiz)->info){
remover(&(*pRaiz)->esq,info);
}
if(info>(*pRaiz)->info){
remover(&(*pRaiz)->dir,info);
}
if (info==(*pRaiz)->info){
}
}
}
void exibirPreOrdem(no **pRaiz){
if(*pRaiz!=NULL){
printf("\n%d",(*pRaiz)->info);
exibirPreOrdem(&(*pRaiz)->esq);
exibirPreOrdem(&(*pRaiz)->dir);
}
}
void exibirEmOrdem(no **pRaiz){
if(*pRaiz!=NULL){
exibirPreOrdem(&(*pRaiz)->esq);
printf("\n%d",(*pRaiz)->info);
exibirPreOrdem(&(*pRaiz)->dir);
}
}
void exibirPosOrdem(no **pRaiz){
if(*pRaiz!=NULL){
exibirPreOrdem(&(*pRaiz)->esq);
exibirPreOrdem(&(*pRaiz)->dir);
printf("\n%d",(*pRaiz)->info);
}
}
int Menu(){
printf("\n\nMenu\n");
printf("\n1 - Inserir");
printf("\n2 - Remover");
printf("\n3 - Imprimir");
printf("\n4 - Sair");
printf("\nDigite sua opcao:");
int opcao=0;
while (opcao<1&&opcao>4){
scanf("%d",&opcao);
}
return opcao;
}
int menuImprimir(){
printf("\n\nMenu de Impressao\n");
printf("\n1 - Pre Ordem");
printf("\n2 - Em Ordem");
printf("\n3 - Pos Ordem");
printf("\nDigite sua opcao:");
int opcao=0;
while (opcao<1&&opcao>3){
scanf("%d",&opcao);
}
return opcao;
}
int altura (no **r) {
if (r == NULL) return -1;
else {
int he = altura (r->esq);
int hd = altura (r->dir);
if (he < hd)
return hd + 1;
else
return he + 1;
}
}
void rot_dir(no *p) {
no *q, *temp;
q = p->esq;
temp = q->dir;
q->dir = p;
p->esq = temp;
p = q;
}
void rot_esq(no *p){
no *q, *temp;
q = p->dir;
temp = q->esq;
q->esq = p;
p->dir = temp;
p = q;
}
void rot_esq_dir(no *p){
rot_esq(p->esq);
rot_dir(p);
}
void rot_dir_esq(no *p){
rot_dir(p->dir);
rot_esq(p);
}
int main(void) {
no *raiz;
criarArvore(&raiz);
int valor=0;
while(1){
switch(Menu()){
case 1:
printf("\nDigite o valor do no a ser inserido: ");
scanf("%d",&valor);
inserir(&raiz,valor);
break;
case 2:
/*printf("\nDigite o valor do no a ser removido: ");
scanf("%d",&valor);
remover(&raiz,valor);*/
printf("\nOps! A remocao nao esta pronta ainda.");
break;
case 3:
switch(menuImprimir()){
case 1:
exibirPreOrdem(&raiz);
break;
case 2:
exibirEmOrdem(&raiz);
break;
case 3:
exibirPosOrdem(&raiz);
break;
}
break;
case 4:
return 0;
break;
}
}
return 0;
}