CTreeNode

CTreeNode sınıfı, ikili CTree ağacının düğüm sınıfıdır.

Açıklama

CTreeNode sınıfı, CTree ikili ağacının düğümleriyle çalışmaya olanak sağlar. Sınıf içinde, ağaç üzerinde konumlandırma yapmak için seçenekler bulunur. Ayrıca dosya işlemleri için gereken yöntemler de sınıf içerisinde yer almaktadır.

Bildirim

   class CTreeNode : public CObject

Başlık

   #include <Arrays\TreeNode.mqh>

Kalıtım hiyerarşisi

  CObject

      CTreeNode

İlk nesil

CTree

Sınıf Yöntemleri

Özellikler

 

Owner

Düğüm sahibinin işaretçisini alır/ayarlar

Left

Sol düğümün işaretçisini alır/ayarlar

Right

Sağ düğümün işaretçisini alır/ayarlar

Balance

Düğüm dengesini alır

BalanceL

Düğümün sol-alt dalının dengesini alır

BalanceR

Düğümün sağ-alt dalının dengesini alır

Yeni eleman oluşturulması

 

CreateSample

Yeni bir düğüm örneği oluşturur

Karşılaştırma

 

RefreshBalance

Düğüm dengesini yeniden hesaplar

Arama

 

GetNext

Sonraki düğümün işaretçisini alır

Giriş/Çıkış

 

SaveNode

Düğüm verilerini bir dosyaya kaydeder

LoadNode

Düğüm verilerini bir dosyadan yükler

virtual Type

Düğümün tip tanımlayıcısını alır

Sınıftan türetilen yöntemler CObject

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

Ağaçlara dair pratik uygulamalar CTreeNode sınıfının soyundan gelir.

CTreeNode sınıfının soyundan gelen her örnek şu ön-tanımlı yöntemleri içermelidir: CreateSample (CTreeNode soyundan gelen sınıfın bir örneğini oluşturur), Compare (CTreeNode soyundan gelen sınıfın anahtar bölgelerindeki değerleri karşılaştırır), Type (düğümü tanımlamak gerektiğinde kullanılır), SaveNode ve LoadNode (dosya işlemleri gerektiğinde kullanılır).

CTree soyundan gelen bir sınıf örneğini ele alalım.

//+------------------------------------------------------------------+
//|                                                   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>
//+------------------------------------------------------------------+
//| CTreeNode'dan türeyen bir sınıf tanımla.                         |
//+------------------------------------------------------------------+
//| CMyTreeNode sınıfı.                                              |
//| Amaç: bir ikili ağaç elemanının sınıfı.                          |
//|             CTreeNode sınıfının bir türevi.                      |
//+------------------------------------------------------------------+
class CMyTreeNode : public CTreeNode
  {
protected:
   //--- kullanıcı verisi
   long              m_long;            // long tipi için anahtar alan
   double            m_double;          // double tipli, kullanıcı-tanımlı değişken
   string            m_string;          // string tipli, kullanıcı-tanımlı değişken
   datetime          m_datetime;        // datetime tipli, kullanıcı-tanımlı değişken
 
public:
                     CMyTreeNode();
   //--- kullanıcı verisine ulaşma yöntemleri
   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;  }
   //--- dosyalarla çalışmak için yöntemler
   virtual bool      Save(int file_handle);
   virtual bool      Load(int file_handle);
protected:
   virtual int       Compare(const CObject *node,int mode);
   //--- sınıf örnekleri oluşturmak için yöntemler
   virtual CTreeNode* CreateSample();
  };
//+------------------------------------------------------------------+
//| CMyTreeNode sınıf yapıcısı.                                      |
//| INPUT:  yok.                                                     |
//| OUTPUT: yok.                                                     |
//| REMARK: yok.                                                     |
//+------------------------------------------------------------------+
void CMyTreeNode::CMyTreeNode()
  {
//--- kullanıcı verisinin başlatılması
   m_long        =0;
   m_double      =0.0;
   m_string      ="";
   m_datetime    =0;
  }
//+------------------------------------------------------------------+
//| Belirtilen algoritmayla, ağaç düğümlerinin karşılaştırılması.    |
//| INPUT:  node - karşılaştırılacak dizi elemanı,                   |
//|         mode - kıyaslama algoritmasının tanımlayıcısı.           |
//| OUTPUT: karşılaştırma sonucu (>0,0,<0).                          |
//| REMARK: yok.                                                     |
//+------------------------------------------------------------------+
int CMyTreeNode::Compare(const CObject *node,int mode)
  {
//--- başka kıyaslama algoritması olmadığından 'mode' parametresi göz-ardı edildi
   int res=0;
//--- açık tip dönüşümü
   CMyTreeNode *n=node;
   res=(int)(m_long-n.m_long);
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| Yeni bir sınıf örneği oluşturma.                                 |
//| INPUT:  yok.                                                     |
//| OUTPUT: yeni CMyTreeNode sınıf örneğinin işaretçisi.             |
//| REMARK: yok.                                                     |
//+------------------------------------------------------------------+
CTreeNode* CMyTreeNode::CreateSample()
  {
   CMyTreeNode *result=new CMyTreeNode;
//---
   return(result);
  }
//+------------------------------------------------------------------+
//| Düğüm verisini dosyaya yaz.                                      |
//| INPUT:  file_handle – açılmış olan dosyanın tanıtıcı değeri.     |
//| OUTPUT: doğruysa true, değilse false.                            |
//| REMARK: yok.                                                     |
//+------------------------------------------------------------------+
bool CMyTreeNode::Save(int file_handle)
  {
   uint i=0,len;
//--- denetle
   if(file_handle<0) return(false);
//--- writing user data
//--- long tipli kullanıcı tanımlı değişkeni yaz
   if(FileWriteLong(file_handle,m_long)!=sizeof(long))          return(false);
//--- double tipli kullanıcı tanımlı değişkeni yaz
   if(FileWriteDouble(file_handle,m_double)!=sizeof(double))    return(false);
//--- string tipli kullanıcı tanımlı değişkeni yaz
   len=StringLen(m_string);
//--- dizgi uzunluğunu yaz
   if(FileWriteInteger(file_handle,len,INT_VALUE)!=INT_VALUE)   return(false);
//--- dizgiyi yaz
   if(len!=0 && FileWriteString(file_handle,m_string,len)!=len) return(false);
//--- datetime tipli kullanıcı tanımlı değişkeni yaz
   if(FileWriteLong(file_handle,m_datetime)!=sizeof(long))      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Düğüm verisini dosyadan oku.                                     |
//| INPUT:  file_handle – açılmış olan dosyanın tanıtıcı değeri.     |
//| OUTPUT: doğruysa true, değilse false.                            |
//| REMARK: yok.                                                     |
//+------------------------------------------------------------------+
bool CMyTreeNode::Load(int file_handle)
  {
   uint i=0,len;
//--- denetle
   if(file_handle<0) return(false);
//--- oku
   if(FileIsEnding(file_handle)) return(false);
//--- char tipli kullanıcı tanımlı değişkenin okunması
//--- long tipli kullanıcı tanımlı değişkenin okunması
   m_long=FileReadLong(file_handle);
//--- double tipli kullanıcı tanımlı değişkenin okunması
   m_double=FileReadDouble(file_handle);
//--- string tipli kullanıcı tanımlı değişkenin okunması
//--- dizgi uzunluğunu oku
   len=FileReadInteger(file_handle,INT_VALUE);
//--- dizgiyi oku
   if(len!=0) m_string=FileReadString(file_handle,len);
   else       m_string="";
//--- datetime tipli kullanıcı tanımlı değişkenin okunması
   m_datetime=FileReadLong(file_handle);
//---
   return(true);
  }