CTreeNode

La classe CTreeNode représente un noeud de l'arbre binaire CTree.

Description

La classe CTreeNode permet de travailler avec les noeuds d'un arbre binaire CTree. Les options de navigation au travers de l'arbre sont implémentées dans la classe. Elle implémente également les méthodes permettant de travailler avec les fichiers.

Déclaration

   class CTreeNode : public CObject

Titre

   #include <Arrays\TreeNode.mqh>

Hiérarchie d'héritage

  CObject

      CTreeNode

Descendants directs

CTree

Méthodes de Classe

Attributs

 

Owner

Retourne/Définit le pointeur du noeud père

Left

Retourne/Définit le pointeur situé à gauche

Right

Retourne/Définit le pointeur situé à droite

Balance

Retourne la balance du noeud

BalanceL

Retourne la balance de la sous-branche de gauche du noeud

BalanceR

Retourne la balance de la sous-branche de droite du noeud

Création d'u nouvel élément

 

CreateSample

Création d'un nouveau noeud

Comparaison

 

RefreshBalance

Recalcule la balance du noeud

Recherche

 

GetNext

Retourne le pointeur du noeud suivant

Entrée/Sortie

 

SaveNode

Sauvegarde les données du noeud dans un fichier

LoadNode

Charge les données d'un noeud depuis un fichier

virtual Type

Retourne l'identifiant du type du noeud

Méthodes héritées de la classe CObject

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

Les arbres de classes dérivant de CTreeNode sont mis en application.

Une classe dérivant de la classe doit implémenter les méthodes : CreateSample pour créer une nouvelle instance de la classe dérivant de la classe CTreeNode, Compare pour comparer les valeurs des champs clés de la classe dérivant de la classe CTreeNode, Type (si nécéssité d'identifier un noeud), SaveNode et LoadNode (si nécéssité de travailler avec des fichiers).

Considérons l'exemple d'une classe dérivée de la classe 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>
//+------------------------------------------------------------------+
//| Décrit la classe dérivée de CTreeNode. |
//+------------------------------------------------------------------+
//| Class CMyTreeNode. |
//| But : Classe d'un élément d'un arbre binaire. |
//|             Descendant de la classe CTreeNode. |
//+------------------------------------------------------------------+
class CMyTreeNode : public CTreeNode
  {
protected:
   //--- données utlisateur
   long              m_long;            // champ clé de type long
   double            m_double;          // variable personnelle de type double
   string            m_string;          // variable personnelle de type string
   datetime          m_datetime;        // variable personnelle de type datetime
 
public:
                     CMyTreeNode();
   //--- méthodes d'accès aux données utilisateur
   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éthodes de travail avec les fichiers
   virtual bool      Save(int file_handle);
   virtual bool      Load(int file_handle);
protected:
   virtual int       Compare(const CObject *node,int mode);
   //--- méthodes de création des instances de classe
   virtual CTreeNode* CreateSample();
  };
//+------------------------------------------------------------------+
//| Constructeur de la classe CMyTreeNode. |
//| ENTREE :  aucun. |
//| SORTIE : aucune. |
//| REMARQUE : aucune. |
//+------------------------------------------------------------------+
void CMyTreeNode::CMyTreeNode()
  {
//--- initialisation des données utilisateur
   m_long        =0;
   m_double      =0.0;
   m_string      ="";
   m_datetime    =0;
  }
//+------------------------------------------------------------------+
//| Comparaison avec un autre noeud par l'algorithme spécifié. |
//| ENTREE :  noeud - élément à comparer,                         |
//|         mode - identifiant de l'algorithme de comparaison. |
//| SORTIE : résultat de la comparaison (>0,0,<0). |
//| REMARQUE : aucune. |
//+------------------------------------------------------------------+
int CMyTreeNode::Compare(const CObject *node,int mode)
  {
//--- le paramètre mode est ignoré, car l'algorithme de construction de l'arbre est le seul
   int res=0;
//--- cast explicite
   CMyTreeNode *n=node;
   res=(int)(m_long-n.m_long);
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| Création d'une nouvelle instance de classe. |
//| ENTREE :  aucun. |
//| SORTIE : pointeur sur la nouvelle instance de classe CMyTreeNode. |
//| REMARQUE : aucune. |
//+------------------------------------------------------------------+
CTreeNode* CMyTreeNode::CreateSample()
  {
   CMyTreeNode *result=new CMyTreeNode;
//---
   return(result);
  }
//+------------------------------------------------------------------+
//| Sauvegarde les données du noeud de l'arbre dans un fichier. |
//| ENTREE :  file_handle - handle d'un fichier ouvert en écriture. |
//| SORTIE : vrai si OK, sinon faux. |
//| REMARQUE : aucune. |
//+------------------------------------------------------------------+
bool CMyTreeNode::Save(int file_handle)
  {
   uint i=0,len;
//--- vérifications préliminaires
   if(file_handle<0) return(false);
//--- écriture des données utilisateur
//--- écriture des variables personnelles de type long
   if(FileWriteLong(file_handle,m_long)!=sizeof(long))          return(false);
//--- écriture des variables personnelles de type double
   if(FileWriteDouble(file_handle,m_double)!=sizeof(double))    return(false);
//--- écriture des variables personnelles de type string
   len=StringLen(m_string);
//--- écriture de la longueur de la chaîne
   if(FileWriteInteger(file_handle,len,INT_VALUE)!=INT_VALUE)   return(false);
//--- écriture de la chaîne
   if(len!=0 && FileWriteString(file_handle,m_string,len)!=len) return(false);
//--- écriture des données personnelles de type datetime
   if(FileWriteLong(file_handle,m_datetime)!=sizeof(long))      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Charge les données du noeud de l'arbre depuis un fichier. |
//| ENTREE :  file_handle - handle d'un fichier ouvert en lecture. |
//| SORTIE : vrai si OK, sinon faux. |
//| REMARQUE : aucune. |
//+------------------------------------------------------------------+
bool CMyTreeNode::Load(int file_handle)
  {
   uint i=0,len;
//--- vérifications préliminaires
   if(file_handle<0) return(false);
//--- lecture
   if(FileIsEnding(file_handle)) return(false);
//--- lecture des variables personnelles de type char
//--- lecture des variables personnelles de type long
   m_long=FileReadLong(file_handle);
//--- lecture des variables personnelles de type double
   m_double=FileReadDouble(file_handle);
//--- lecture des variables personnelles de type string
//--- lecture de la longueur de la chaîne
   len=FileReadInteger(file_handle,INT_VALUE);
//--- lecture de la chaîne
   if(len!=0) m_string=FileReadString(file_handle,len);
   else       m_string="";
//--- lecture des variables personnelles de type datetime
   m_datetime=FileReadLong(file_handle);
//---
   return(true);
  }