CTreeNode

La classe CTreeNode è una classe del nodo albero binario Ctree.

Descrizione

CTreeNode offre la possibilità di lavorare con i nodi dell'albero binario Ctree. Le opzioni di navigazione attraverso l'albero sono implementate nella classe. Inoltre, sono implementati i metodi di lavoro con il file.

Dichiarazione

   class CTreeNode : public CObject

Titolo

   #include <Arrays\TreeNode.mqh>

Gerarchia di ereditarietà

  CObject

      CTreeNode

Discendenti diretti

CTree

I Metodi della Classe per Gruppi

Attributi

 

Owner

Ottiene/imposta il puntatore del nodo proprietario

Left

Ottiene/imposta il puntatore del nodo di sinistra

Right

Ottiene/imposta il puntatore del nodo di destra

Balance

Ottiene il bilanciamento del nodo

BalanceL

Ottiene il bilancio del sotto-ramo sinistro del nodo

BalanceR

Ottiene il bilancio del sotto-ramo destro del nodo

Creazione di un nuovo elemento

 

CreateSample

Crea una nuova istanza del nodo

Confronto

 

RefreshBalance

Ricalcola il bilanciamento del nodo

Ricerca

 

GetNext

Ottiene il puntatore del nodo successivo

Input/Output

 

SaveNode

Salva i dati del nodo in un file

LoadNode

Scarica i dati del nodo da un file

virtual Type

Ottiene l'identificatore del tipo di nodo

Metodi ereditati dalla classe CObject

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

Alberi di classi discendenti di CTreeNode hanno applicazione pratica.

Un discendente della classe CTreeNode dovrebbe avere metodi predefiniti: CreateSample crea una nuova istanza della classe discendente di CTreeNode, Compare confronta i valori di campi chiave della classe discendente di CTreeNode, Type (se è necessario identificare un nodo), SaveNode e LoadNode (se è necessario lavorare con un file).

Prendiamo in considerazione un esempio di una classe discendente 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>
//+------------------------------------------------------------------+
//| Descrivi la classe CMyTreeNode derivata da CTreeNode.               |
//+------------------------------------------------------------------+
//| Classe CMyTreeNode.                                               |
//| Scopo: Classe di elemento di un albero binario.                      |
//|             Descendente della classe CTreeNode.                       |
//+------------------------------------------------------------------+
class CMyTreeNode : public CTreeNode
  {
protected:
   //--- dati utente
   long              m_long;            // campo chiave di tipo long
   double            m_double;          // variabile personalizzata di tipo double
   string            m_string;          // variable personalizzata di tipo string
   datetime          m_datetime;        // variable personalizzata di tipo datetime
 
public:
                     CMyTreeNode();
   //--- metodi di accesso ai dati utente
   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;  }
   //--- metodi per il lavoro con i file
   virtual bool      Save(int file_handle);
   virtual bool      Load(int file_handle);
protected:
   virtual int       Compare(const CObject *node,int mode);
   //--- metodi di creazione di istanze della classe
   virtual CTreeNode* CreateSample();
  };
//+------------------------------------------------------------------+
//| CMyTreeNode costruttore della classe.                                   |
//| INPUT:  niente.                                                    |
//| OUTPUT: niete.                                                    |
//| REMARK: niente.                                                    |
//+------------------------------------------------------------------+
void CMyTreeNode::CMyTreeNode()
  {
//--- inizializzazione dei dati utente
   m_long        =0;
   m_double      =0.0;
   m_string      ="";
   m_datetime    =0;
  }
//+------------------------------------------------------------------+
//| Confronto con un altro nodo dell'albero per algoritmo specificato.    |
//| INPUT:  nodo - elementi dell'albero da comparare, |
//|         mode - identificatore dell'algoritmo di confronto.               |
//| OUTPUT: risultato del confronto (>0,0,<0).                          |
//| REMARK: niente.                                                    |
//+------------------------------------------------------------------+
int CMyTreeNode::Compare(const CObject *node,int mode)
  {
//--- il parametro mode viene ignorato, perché l'algoritmo di costruzione albero è l'unico
   int res=0;
//--- type casting esplicito
   CMyTreeNode *n=node;
   res=(int)(m_long-n.m_long);
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| Creazione di una nuova istanza della classe.                                |
//| INPUT:  niente.                                                    |
//| OUTPUT: puntatore ad una nuova istanza della classe CMyTreeNode.          |
//| REMARK: niente.                                                    |
//+------------------------------------------------------------------+
CTreeNode* CMyTreeNode::CreateSample()
  {
   CMyTreeNode *result=new CMyTreeNode;
//---
   return(result);
  }
//+------------------------------------------------------------------+
//| Scrive i dati nodo dell'albero in un file.                                  |
//| INPUT:  file_handle -handle di un file pre-aperto per la scrittura.    |
//| OUTPUT: true se OK, altrimenti false.                             |
//| REMARK: niente.                                                    |
//+------------------------------------------------------------------+
bool CMyTreeNode::Save(int file_handle)
  {
   uint i=0,len;
//--- controllo
   if(file_handle<0) return(false);
//--- scrive dati utente
//--- scrittura variabile personalizzata di tipo long
   if(FileWriteLong(file_handle,m_long)!=sizeof(long))          return(false);
//--- scrittura variabile personalizzata di tipo double
   if(FileWriteDouble(file_handle,m_double)!=sizeof(double))    return(false);
//--- scrittura variabile personalizzata di tipo string
   len=StringLen(m_string);
//--- scrive la lunghezza della stringa
   if(FileWriteInteger(file_handle,len,INT_VALUE)!=INT_VALUE)   return(false);
//--- scrive la stringa
   if(len!=0 && FileWriteString(file_handle,m_string,len)!=len) return(false);
//--- scrittura variabile personalizzata di tipo datetime
   if(FileWriteLong(file_handle,m_datetime)!=sizeof(long))      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Legge i dati nodo dell'albero da un file.                                 |
//| INPUT:  file_handle -handle di un file pre-aperto per la lettura.    |
//| OUTPUT: true se OK, altrimenti false.                             |
//| REMARK: niente.                                                    |
//+------------------------------------------------------------------+
bool CMyTreeNode::Load(int file_handle)
  {
   uint i=0,len;
//--- controllo
   if(file_handle<0) return(false);
//--- lettura
   if(FileIsEnding(file_handle)) return(false);
//--- lettura variabile personalizzata di tipo char
//--- lettura variabile personalizzata di tipo long
   m_long=FileReadLong(file_handle);
//--- lettura variabile personalizzata di tipo double
   m_double=FileReadDouble(file_handle);
//--- lettura variabile personalizzata di tipo string
//--- legge la lunghezza della stringa
   len=FileReadInteger(file_handle,INT_VALUE);
//--- legge la stringa
   if(len!=0) m_string=FileReadString(file_handle,len);
   else       m_string="";
//--- lettura variabile personalizzata di tipo datetime
   m_datetime=FileReadLong(file_handle);
//---
   return(true);
  }