#include <iostream>
using namespace std;
class Nodo
{
public:
int ele, nhijos;
Nodo *padre;
Nodo *izq;
Nodo *der;
Nodo();
};
Nodo::Nodo()
{
ele=0;
nhijos=0;
}
class ArbolBinario
{
public:
Nodo *raiz;
int cnodo, choja, con, sum, profu;
ArbolBinario();
void Insertar(int e);
//void Eliminar();
void Imprimir_Pre(Nodo *actual);
void Imprimir_Orden(Nodo *actual);
void Imprimir_Post(Nodo *actual);
void Busqueda(Nodo *actual, int e);
void Busqueda2(Nodo *actual, int e);
void Recorrer(Nodo *actual);
void Encontrar(Nodo *actual, int maymen);
};
ArbolBinario::ArbolBinario()
{
raiz=NULL;
cnodo=0;
choja=0;
sum=0;
profu=-999;
}
void ArbolBinario::Insertar(int e)
{
int nro=0;
Nodo *actual, *siguiente;
if (raiz==NULL)
{
Nodo *nuevo=new Nodo;
nuevo->ele=e;
nuevo->izq=NULL;
nuevo->der=NULL;
nuevo->padre=NULL;
raiz=nuevo;
sum+=e;
cnodo++;
}
else
{
actual=raiz;
siguiente=raiz;
Nodo *nuevo=new Nodo;
nuevo->ele=e;
nuevo->izq=NULL;
nuevo->der=NULL;
nuevo->padre=NULL;
actual->nhijos+=1;
while(e!=nro && siguiente!=NULL)
{
nro=siguiente->ele;
actual=siguiente;
if (e<nro)
{
siguiente=actual->izq;
}
else
{
siguiente=actual->der;
}
}
if (e==(actual->ele))
{
cout <<"Es un duplicado!\n";
}
else
{
cnodo++;
sum+=e;
//actual->nhijos+=1;
if (e<(actual->ele))
{
actual->izq=nuevo;
nuevo->padre=actual;
}
else
{
actual->der=nuevo;
nuevo->padre=actual;
}
}
}
}
void ArbolBinario::Imprimir_Pre(Nodo *actual)
{
if (actual==NULL)
{
return;
}
else
{
cout <<actual->ele<<"\n";
Imprimir_Pre(actual->izq);
Imprimir_Pre(actual->der);
}
}
void ArbolBinario::Imprimir_Orden(Nodo *actual)
{
if (actual==NULL)
{
return;
}
else
{
Imprimir_Orden(actual->izq);
cout <<actual->ele<<"\n";
Imprimir_Orden(actual->der);
}
}
void ArbolBinario::Imprimir_Post(Nodo *actual)
{
if (actual==NULL)
{
return;
}
else
{
Imprimir_Post(actual->izq);
Imprimir_Post(actual->der);
cout <<actual->ele<<"\n";
}
}
void ArbolBinario::Busqueda(Nodo *actual, int e)
{
Nodo *papa=NULL, *abuelo=NULL;
if (actual==NULL)
{
cout <<"No se encontro el elemento!\n";
return;
}
else
{
papa=actual->padre;
if (papa!=NULL)
{
abuelo=papa->padre;
}
if (actual->ele==e)
{
cout <<"El elemento "<<actual->ele<<" fue encontrado!\n";
if (papa!=NULL) cout <<"El padre del mismo es: "<<papa->ele;
if (abuelo!=NULL) cout <<"\nEl abuelo es: "<<abuelo->ele;
cout <<"\n";
}
else if (e>actual->ele)
{
Busqueda(actual->der, e);
}
else
{
Busqueda(actual->izq, e);
}
}
}
void ArbolBinario::Busqueda2(Nodo *actual, int e)
{
Nodo *antecesor=NULL;
if (actual==NULL)
{
cout <<"No se encontro el elemento!\n";
return;
}
else
{
if (actual->ele==e)
{
cout <<actual->ele<<"\n";
antecesor=actual->padre;
while (antecesor!=NULL)
{
cout <<antecesor->ele<<"\n";
antecesor=antecesor->padre;
}
}
else if (e>actual->ele)
{
Busqueda2(actual->der, e);
}
else
{
Busqueda2(actual->izq, e);
}
}
}
void ArbolBinario::Recorrer(Nodo *actual)
{
Nodo *antecesor=NULL;
if (actual==NULL)
{
return;
}
else
{
if (actual->izq==NULL && actual->der==NULL)
{
con=0;
choja++;
antecesor=actual->padre;
while (antecesor!=NULL)
{
con++;
antecesor=antecesor->padre;
}
con++;
if (con>profu)
{
profu=con;
}
}
Recorrer(actual->izq);
Recorrer(actual->der);
}
}
void ArbolBinario::Encontrar(Nodo *actual, int maymen)
{
Nodo *sucesor, *antecesor;
antecesor=actual;
if (maymen==1)
{
sucesor=actual->izq;
while (sucesor!=NULL)
{
antecesor=sucesor;
sucesor=sucesor->izq;
}
cout <<"El menor elemento es: "<<antecesor->ele;
}
else
{
sucesor=actual->der;
while (sucesor!=NULL)
{
antecesor=sucesor;
sucesor=sucesor->der;
}
cout <<"El mayor elemento es: "<<antecesor->ele;
}
cout <<"\n";
}