Arboles Binarios c++

Iniciado por maferavagar, 7 Julio 2015, 00:44 AM

0 Miembros y 1 Visitante están viendo este tema.

maferavagar

Buenas Tardes alguien me podria decir que significa within this contex; me dice que HijoIzquierdo,HijoDerecho y valor son privados, estoy usando Dev c++
Pongo mi codigo. De antemano gracias.
Código (cpp) [Seleccionar]
#include <time.h>
#include <stdio.h>

#include <stdlib.h>
#include <cmath>
#include <iostream>

using namespace std;

class Nodo
{
   private:
   int dato;
   Nodo *HijoIzquierdo, *HijoDerecho,*Raiz;
   public:
       Nodo* InsertaNodo(int, Nodo*);
       void EnOrden(Nodo*);
       void PreOrden(Nodo*);
       void PostOrden(Nodo*);
       int Nivel_arbol(Nodo*);
       int NumeroNodo(Nodo*);
       int FE(Nodo*);
       int Total_hojas2(Nodo*);
       int Total_hojas(Nodo*);
       int Suma_nodos(Nodo*);
   
};



//Declaro las funciones que tiene el programa

Nodo::Nodo* InsertaNodo(int valor, Nodo*subArbol)
{
  if(subArbol==NULL)
  {
     subArbol=new Nodo;
     subArbol->HijoIzquierdo=subArbol->HijoDerecho=NULL;
     subArbol->dato=valor;
  }
  else
     
     if(valor<subArbol->dato)
        subArbol->HijoIzquierdo=InsertaNodo(valor, subArbol->HijoIzquierdo);
 
     else
        subArbol->HijoDerecho=InsertaNodo(valor, subArbol->HijoDerecho);
  return(subArbol);
}


void Nodo:: EnOrden(Nodo *subArbol)
{
  if (subArbol!=NULL)
  {
     EnOrden(subArbol->HijoIzquierdo);
     printf("%d ", subArbol->dato);
     EnOrden(subArbol->HijoDerecho);
  }  
}

void Nodo:: PreOrden(Nodo *subArbol)
{
  if (subArbol!=NULL)
  {
     printf("%d ", subArbol->dato);
     PreOrden(subArbol->HijoIzquierdo);      
     PreOrden(subArbol->HijoDerecho);
  }  
}

void Nodo:: PostOrden(Nodo *subArbol)
{
  if (subArbol!=NULL)
  {
     
     PostOrden(subArbol->HijoIzquierdo);      
     PostOrden(subArbol->HijoDerecho);
     printf("%d ", subArbol->dato);
  }  
}

int Nodo:: Nivel_arbol(Nodo *subArbol)
{
   int a=0,b=0;
  if(subArbol==NULL)
  {
     return 0;
  }
 
  else
  {
     a=Nivel_arbol(subArbol->HijoIzquierdo)+1;
     b=Nivel_arbol(subArbol->HijoDerecho)+1;
  }
  if(a>=b)
     return a; //La raiz no se suma
  else
     return b; //La raiz no se suma
 
}

int Nodo:: NumeroNodo (Nodo *subArbol)
{
  if(subArbol==NULL)
     return 0;
 
  else
     return 1+NumeroNodo(subArbol->HijoIzquierdo)+NumeroNodo(subArbol->HijoDerecho);
}

int Nodo:: FE(Nodo *subArbol)
{
  if(subArbol==NULL)
     return 0;
 
  else
     return Nivel_arbol(subArbol->HijoDerecho)-Nivel_arbol(subArbol->HijoIzquierdo);
}

int Nodo:: Total_hojas(Nodo *subArbol)
{
  if(Raiz==NULL)
     return 0;
  if(Raiz->HijoDerecho==NULL && Raiz->HijoIzquierdo==NULL)
     return 0;

  return Total_hojas2(subArbol);
}

int Nodo:: Total_hojas2(Nodo *subArbol)
{
  if(subArbol==NULL)
     return 0;

  if(subArbol->HijoDerecho==NULL&&subArbol->HijoIzquierdo==NULL)
     return 1;

  return Total_hojas(subArbol->HijoDerecho) + Total_hojas(subArbol->HijoIzquierdo);


  //return 0;
}

int Nodo::Suma_nodos(Nodo *subArbol)
{
  if(subArbol==NULL)
     return 0;

  return subArbol->dato + Suma_nodos(subArbol->HijoDerecho) + Suma_nodos(subArbol->HijoIzquierdo);

}

int main()
{
   Nodo Obj;
   
  int k,num,opc=1,valor,nivel=0,nodos=0,nivel_esperado,frecu=0,hojas=0;
  Nodo *Raiz;
  Raiz=NULL;
     
  while(opc!=11)
  {
     printf("1.- Insertar Arbol\n");
     printf("2.- Recorrido en preorden\n");
     printf("3.- Recorrido  en orden\n");
     printf("4.- Recorrido en postorden\n");
     printf("5.- Nivel del arbol\n");
     printf("6.- Numero de Nodos\n");
     printf("7.- Nivel Perfecto de Nodos\n");
     printf("8.- Factor de Equilibrio\n");
     printf("9.- Numero de Hojas\n");
     printf("10.- Suma de Nodos\n");
     printf("11.- Salir\n");
     scanf("%d",&opc);
     
     switch(opc)
     {
        case 1:
           printf("Inserta Numero para el Arbol\n");
           scanf("%d",&num);
           Raiz=Obj.InsertaNodo(num, Raiz);
           //printf("Quieres seguir...");
           break;
       
        case 2:  Obj.PreOrden(Raiz);
           printf("\n");
           break;
           
        case 3:  Obj.EnOrden(Raiz);
           printf("\n");
           break;
           
        case 4:  Obj.PostOrden(Raiz);
           printf("\n");
           break;
           
        case 5:
           nivel=Obj.Nivel_arbol(Raiz);
           printf("Nivel del Arbol %d\n", nivel-1);
           break;
           
        case 6:
           nodos=Obj.NumeroNodo(Raiz);
           printf("Numero de Nodos %d\n", nodos);
           break;
           
        case 7:
           nivel_esperado = long(float(Obj.NumeroNodo(Raiz)))/log(2.0);
           printf("El Nivel Perfecto %d\n", nivel_esperado);
           break;
           
        case 8:
           frecu=Obj.FE(Raiz);
           printf("Factor de Equilibrio es %d \n", frecu);
           break;
       
        case 9:
           hojas=Obj.Total_hojas(Raiz);
           printf("La cantidad de Hojas es %d\n",hojas);
           //cout<<hojas<<endl;
           break;

        case 10:
           printf("La suma es %d\n", Obj.Suma_nodos(Raiz));
           break;


           
     }
     //system("cls");
  }
  system("PAUSE");
  return 0;    
 
}


Mod: Los còdigos deben ir en etiquetas GeSHi, los temas deben ir en sus respectivos subforos, movido

ivancea96

#1
Si es posible, pon el error. El error contiene toda la información necesaria para poder arreglarlo.

EDITO: El error es, por ejemplo en:
Código (cpp) [Seleccionar]
Nodo::Nodo* InsertaNodo(int valor, Nodo*subArbol)
{
   if(subArbol==NULL)
   {
      subArbol=new Nodo;
      subArbol->HijoIzquierdo=subArbol->HijoDerecho=NULL;
      subArbol->dato=valor;
   }


subArbol->HijoIzquierdo es un valor privado. Si bien es cierto que eso es un método de Nodo, solo puedes acceder a los métodos y campos private y protected del mismo objeto.

maferavagar

Ya pude resolver ese problema.
Pero ahora cuando lo vuelvo a compilar me sale un mensaje y dice "expected init-declarator before Insertar_Nodo" y en esa misma linea me dice "expected ',' or ';' before Insertar_Nodo"


public:
               Nodo* Insertar_Nodo(int valor,Nodo* subArbol);
               //void EnOrden(Nodo*);
               //void PreOrden(Nodo*);
               void PostOrden(Nodo*);                
               int Total_hojas2(Nodo*);
               int Total_hojas(Nodo*);
             
};
Nodo*::Nodo Insertar_Nodo(int valor, Nodo*subArbol) // en esta linea marca mi error
{
  if(subArbol==NULL)
  {
     subArbol=new Nodo;
     subArbol->HijoIzquierdo=subArbol->HijoDerecho=NULL;
     subArbol->dato=valor;
  }

ivancea96

Código (cpp) [Seleccionar]
Nodo*  Nodo::Insertar_Nodo(int valor, Nodo*subArbol)