CTreeNode

CTreeNode es una clase de nodos del árbol binario CTree.

Descripción

La clase CTreeNode permite trabajar con nodos del árbol binario CTree. La clase implementa opciones para navegar a través del árbol. Además, también permite trabajar con archivos.

Declaración

   class CTreeNode : public CObject

Título

   #include <Arrays\TreeNode.mqh>

Jerarquía de herencia

  CObject

      CTreeNode

Descendientes directos

CTree

Métodos de la clase

Atributos

 

Owner

Obtiene/establece el puntero del nodo propietario

Left

Obtiene/establece el puntero del nodo izquierdo

Right

Obtiene/establece el puntero del nodo derecho

Balance

Obtiene el peso del nodo

BalanceL

Obtiene el peso de la subrama izquierda del nodo

BalanceR

Obtiene el peso de la subrama derecha del nodo

Creación de un elemento nuevo

 

CreateSample

Crea un nuevo nodo

Comparación

 

RefreshBalance

Recalcula el peso del nodo

Búsqueda

 

GetNext

Obtiene el puntero al siguiente nodo

Entrada/Salida

 

SaveNode

Guarda los datos del nodo en el archivo

LoadNode

Descarga los datos del nodo del archivo

virtual Type

Obtiene el identificador de tipo del nodo

Métodos heredados de la clase CObject

Prev, Prev, Next, Next, Save, Load, Compare

Los árboles de la clase descendiente CTreeNode tienen aplicaciones prácticas.

Los descendientes de la clase CTreeNode deben tener métodos predefinidos: CreateSample para crear una nueva instancia de la clase descendiente de CTreeNode, Compare para comparar los valores de los campos clave de la clase descendiente de CTreeNode, Type (si hace falta identificar un nodo), SaveNode y LoadNode (si es necesario trabajar con un archivo).

Consideremos ahora un ejemplo de clase descendiente de CTree.

//+------------------------------------------------------------------+
//|                                                   MyTreeNode.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                       https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//---
#include <Arrays\TreeNode.mqh>
//+------------------------------------------------------------------+
//| Describe la clase derivada de CTreeNode.                            |
//+------------------------------------------------------------------+
//| Clase CMyTreeNode.                                               |
//| Objetivo: Implementa el nodo de un árbol binario.                      |
//|             Descendiente de la clase CTreeNode.                       |
//+------------------------------------------------------------------+
class CMyTreeNode : public CTreeNode
  {
protected:
   //--- datos de usuario
   long              m_long;            // campo clave de tipo long
   double            m_double;          // variable personalizada de tipo double
   string            m_string;          // variable personalizada de tipo string
   datetime          m_datetime;        // variable personalizada de tipo datetime
 
public:
                     CMyTreeNode();
   //--- métodos para acceder a los datos del usuario
   long              GetLong(void)                { return(m_long); }
   void              SetLong(long value)          { m_long=value;  }
   double            GetDouble(void)              { return(m_double); }
   void              SetDouble(double value)      { m_double=value;  }
   string            GetString(void)              { return(m_string); }
   void              SetString(string value)      { m_string=value;  }
   datetime          GetDateTime(void)            { return(m_datetime); }
   void              SetDateTime(datetime value)  { m_datetime=value;  }
   //--- métodos para trabajar con archivos
   virtual bool      Save(int file_handle);
   virtual bool      Load(int file_handle);
protected:
   virtual int       Compare(const CObject *node,int mode);
   //--- métodos para crear instancias de clase
   virtual CTreeNode* CreateSample();
  };
//+------------------------------------------------------------------+
//| Constructor de la clase CMyTreeNode.                                   |
//| INPUT:  ninguna.                                                    |
//| OUTPUT: ninguna.                                                    |
//| Observaciones: ninguna.                                                    |
//+------------------------------------------------------------------+
void CMyTreeNode::CMyTreeNode()
  {
//--- inicialización de los datos de usuario
   m_long        =0;
   m_double      =0.0;
   m_string      ="";
   m_datetime    =0;
  }
//+------------------------------------------------------------------+
//| Comparación con otro nodo por el algoritmo especificado.   |
//| INPUT:  node - elemento a comparar,                         |
//|         mode - identificador del algoritmo de comparación.               |
//| OUTPUT: resultado de la comparación (>0,0,<0).                          |
//| Observaciones: ninguna.                                                    |
//+------------------------------------------------------------------+
int CMyTreeNode::Compare(const CObject *node,int mode)
  {
//--- el parámetro mode es ignorado
   int res=0;
//--- conversión de tipos explícita
   CMyTreeNode *n=node;
   res=(int)(m_long-n.m_long);
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| Creación de una nueva instancia de la clase.                                |
//| INPUT:  ninguna.                                                    |
//| OUTPUT: puntero a una instancia nueva de la clase CMyTreeNode.          |
//| Observaciones: ninguna.                                                    |
//+------------------------------------------------------------------+
CTreeNode* CMyTreeNode::CreateSample()
  {
   CMyTreeNode *result=new CMyTreeNode;
//---
   return(result);
  }
//+------------------------------------------------------------------+
//| Escribe el nodo en el archivo.                                  |
//| INPUT:  file_handle - manejador de archivo abierto para escritura.    |
//| OUTPUT: true si se ejecuta correctamente; false en caso contrario.                             |
//| Observaciones: ninguna.                                                    |
//+------------------------------------------------------------------+
bool CMyTreeNode::Save(int file_handle)
  {
   uint i=0,len;
//--- comprobación
   if(file_handle<0) return(false);
//--- escribe los datos de usuario
//--- escribe la variable personalizada de tipo long
   if(FileWriteLong(file_handle,m_long)!=sizeof(long))          return(false);
//--- escribe la variable personalizada de tipo double
   if(FileWriteDouble(file_handle,m_double)!=sizeof(double))    return(false);
//--- escribe la variable personalizada de tipo string
   len=StringLen(m_string);
//--- escribe la longitud de la cadena de caracteres
   if(FileWriteInteger(file_handle,len,INT_VALUE)!=INT_VALUE)   return(false);
//--- escribe la cadena
   if(len!=0 && FileWriteString(file_handle,m_string,len)!=len) return(false);
//--- escribe la variable personalizada de tipo datetime
   if(FileWriteLong(file_handle,m_datetime)!=sizeof(long))      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Lee los datos del nodo del archivo.                                 |
//| INPUT:  file_handle - manejador de archivo abierto para lectura.    |
//| OUTPUT: true si se ejecuta correctamente; false en caso contrario.                             |
//| Observaciones: ninguna.                                                    |
//+------------------------------------------------------------------+
bool CMyTreeNode::Load(int file_handle)
  {
   uint i=0,len;
//--- comprobación
   if(file_handle<0) return(false);
//--- lectura
   if(FileIsEnding(file_handle)) return(false);
//--- lee la variable personalizada de tipo char
//--- lee la variable personalizada de tipo long
   m_long=FileReadLong(file_handle);
//--- lee la variable personalizada de tipo double
   m_double=FileReadDouble(file_handle);
//--- lee la variable personalizada de tipo string
//--- lee la longitud de la cadena
   len=FileReadInteger(file_handle,INT_VALUE);
//--- lee la cadena
   if(len!=0) m_string=FileReadString(file_handle,len);
   else       m_string="";
//--- lee la variable personalizada de tipo datetime
   m_datetime=FileReadLong(file_handle);
//---
   return(true);
  }