CTree

CTree; CTreeNode ve onun soyundan gelen sınıf örneklerinin ikili ağaçları için tasarlanmış bir sınıftır.

Açıklama

CTree sınıfı, CTreeNode ve onun soyundan gelen sınıf örneklerinin ikili ağaçları ile çalışmaya olanak sağlar. Ağaç elemanlarının eklenip silinmesi ve arama gibi seçenekler sınıf içerisinde uygulanmıştır. Ayrıca dosya işlemleri için gereken yöntemler de sınıf içerisinde yer almaktadır.

CList ve CArrayObj sınıflarından farklı olarak, bellek yönetim mekanizması CTree içerisinde uygulanmamıştır. Tüm ağaç düğümleri bellek temizleme işlemi ile silinir.

Bildirim

   class CTree : public CTreeNode

Başlık

   #include <Arrays\Tree.mqh>

Kalıtım hiyerarşisi

  CObject

      CTreeNode

          CTree

Sınıf Yöntemleri

Özellikler

 

Root

Ağacın kök elemanını alır

Yeni eleman oluşturulması

 

CreateElement

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

Doldurma

 

Insert

Ağaca yeni bir düğüm ekler

Silme

 

Detach

Belli bir düğümü ağaçtan ayırır

Delete

Belirtilen bir düğümü ağaçtan siler

Clear

Ağacın tüm düğümlerini temizler

Arama

 

Find

Ağaç içerisinde, örneğe göre bir düğüm arar

Girdi/çıktı

 

virtual Save

Tüm ağaç verisini dosyaya kaydeder

virtual Load

Ağaç verisini dosyadan yükler

virtual Type

Ağacın tip tanımlayıcısını alır

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

Prev, Prev, Next, Next, Compare

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

Parent, Parent, Left, Left, Right, Right, Balance, BalanceL, BalanceR, RefreshBalance, GetNext, SaveNode, LoadNode

Ağaçlarla ilgi pratik uygulamalar CTreeNode sınıfının – ve dolayısıyla CTree – sınıfının soyundan gelir.

CTree'nin soyundan gelen sınıf, CreateElement ön-tanımlı yöntemini içermelidir. Bu yöntem CTreeNode türetik sınıfının örneklerini oluşturur.

CTree sınıfından türetilen bir örneğe bakalım:

//+------------------------------------------------------------------+
//|                                                       MyTree.mq5 |
//|                         Copyright 2000-2024, MetaQuotes Ltd. |
//| www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//---
#include <Arrays\Tree.mqh>
#include "MyTreeNode.mqh"
//---
input int extCountedNodes = 100;
//+------------------------------------------------------------------+
//| CTree'den türetilen CMyTree sınıfını tanımla.                    |
//+------------------------------------------------------------------+
//| CMyTree sınıfı                                                   |
//| Amaç: İkili arama ağacının inşaası ve konumlandırılması.         |
//+------------------------------------------------------------------+
class CMyTree : public CTree
  {
public:
   //--- Ağaç üzerinde kullanıcı tanımlı arama yöntemleri
   CMyTreeNode*        FindByLong(long find_long);
   //--- Ağaç elemanı oluşturma yöntemi
   virtual CTreeNode *CreateElement();
  };
//---
CMyTree MyTree;
//+------------------------------------------------------------------+
//| Yeni bir ağaç elemanı oluşturma.                                 |
//| INPUT:  yok.                                                     |
//| OUTPUT: yeni ağaç düğümünün işaretçisi OK veya NULL.             |
//| REMARK: yok.                                                     |
//+------------------------------------------------------------------+
CTreeNode *CMyTree::CreateElement()
  {
   CMyTreeNode *node=new CMyTreeNode;
//---
   return(node);
  }
//+------------------------------------------------------------------+
//| m_long değerini kullanarak listede bir eleman ara.               |
//| INPUT:  find_long - aranan değer.                                |
//| OUTPUT: bulunan liste elemanının işaretçisi veya NULL.           |
//| REMARK: yok.                                                     |
//+------------------------------------------------------------------+
CMyTreeNode* CMyTree::FindByLong(long find_long)
  {
   CMyTreeNode *res=NULL;
   CMyTreeNode *node;
//--- arama parametresini geçirebilmek için bir ağaç düğümü oluştur
   node=new CMyTreeNode;
   if(node==NULLreturn(NULL);
   node.SetLong(find_long);
//---
   res=Find(node);
   delete node;
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| script "CMyTree sınıfı için bir sınama"                          |
//+------------------------------------------------------------------+
//---  dizgi başlatma için bir bir dizi
string str_array[11]={"p","oo","iii","uuuu","yyyyy","ttttt","rrrr","eee","ww","q","999"};
//---
int OnStart() export
  {
   int          i;
   uint         pos;
   int          beg_time,end_time;
   CMyTreeNode *node; //--- CMyTreeNode sınıf örneği için geçici işaretçi
//---  
   printf("Sınamayı başlat %s.",__FILE__);
//--- MyTree ağacını MyTreeNode sınıfının örnekleri ile extCountedNodes sayısı kadar doldur.
   beg_time=GetTickCount();
   for(i=0;i<extCountedNodes;i++)
     {
      node=MyTree.CreateElement();
      if(node==NULL)
        {
         //--- acil çıkış
         printf("%s (%4d): oluşturma hatası",__FILE__,__LINE__);
         return(__LINE__);
        }
      NodeSetData(node,i);
      node.SetLong(i);
      MyTree.Insert(node);
     }
   end_time=GetTickCount();
   printf("MyTree doldurma zamanı: %d ms.",end_time-beg_time);
//--- TmpMyTree geçici ağacını oluştur.
   CMyTree TmpMyTree;
//--- Ağaç elemanlarının 50%'sini (tek olanları) ağaçtan ayır
//--- ve onları geçici olarak TmpMyTree ağacına ekle.
   beg_time=GetTickCount();
   for(i=0;i<extCountedNodes;i+=2)
     {
      node=MyTree.FindByLong(i);
      if(node!=NULL)
         if(MyTree.Detach(node)) TmpMyTree.Insert(node);
     }
   end_time=GetTickCount();
   printf(" %d elemanın MyTree ağacıdan silinme zamanı %d ms.",extCountedNodes/2,end_time-beg_time);
//--- Ayrılan elemanlara dönüş yap
   node=TmpMyTree.Root();
   while(node!=NULL)
     {
      if(TmpMyTree.Detach(node)) MyTree.Insert(node);
      node=TmpMyTree.Root();
     }
//--- Save(int file_handle) yönteminin işleyişini kontrol et
   int file_handle;
   file_handle=FileOpen("MyTree.bin",FILE_WRITE|FILE_BIN|FILE_ANSI);
   if(file_handle>=0)
     {
      if(!MyTree.Save(file_handle))
        {
         //--- dosya yazma hatası
         //--- acil çıkış
         printf("%s: Hata %d, %d numaralı satır!",__FILE__,GetLastError(),__LINE__);
         //--- çıkmadan önce dosyayı kapa!!!
         FileClose(file_handle);
         return(__LINE__);
        }
      FileClose(file_handle);
     }
//--- Load(int file_handle) yönteminin işleyişini kontrol et
   file_handle=FileOpen("MyTree.bin",FILE_READ|FILE_BIN|FILE_ANSI);
   if(file_handle>=0)
     {
      if(!TmpMyTree.Load(file_handle))
        {
         //--- dosya okuma hatası
         //--- acil çıkış
         printf("%s: Hata %d, %d numaralı satır!",__FILE__,GetLastError(),__LINE__);
         //--- çıkmadan önce dosyayı kapa!!!
         FileClose(file_handle);
         return(__LINE__);
        }
      FileClose(file_handle);
     }
//---
   MyTree.Clear();
   TmpMyTree.Clear();
//---
   printf("testi sonlandır %s. OK!",__FILE__);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Düğüm içeriklerini günlüğe atma fonksiyonu                       |
//+------------------------------------------------------------------+
void NodeToLog(CMyTreeNode *node)
  {
   printf("   %I64d,%f,'%s','%s'",
               node.GetLong(),node.GetDouble(),
               node.GetString(),TimeToString(node.GetDateTime()));
  }
//+------------------------------------------------------------------+
//| Elemanları rassal değerlerle "doldurma" fonksiyonu               |
//+------------------------------------------------------------------+
void NodeSetData(CMyTreeNode *node,int mode)
  {
   if(mode%2==0)
     {
      node.SetLong(mode*MathRand());
      node.SetDouble(MathPow(2.02,mode)*MathRand());
     }
   else
     {
      node.SetLong(mode*(long)(-1)*MathRand());
      node.SetDouble(-MathPow(2.02,mode)*MathRand());
     }
   node.SetString(str_array[mode%10]);
   node.SetDateTime(10000*mode);
  }