CTree

CTree ist eine Klasse vom binären Baum der Instanzen von CTreeNode-Klasse und ihre geerbten Klassen.

Beschreibung

Klasse CTree bietet die Möglichkeit, mit dem binären Baum der Instanzen der CTreeNode-Klasse und ihrer Nachfolger zu arbeiten. Die Klasse erlaubt Baumelemente hinzuzufügen/einzufügen/zu löschen und im Baum zu suchen. Darüber hinaus sind Methoden für Arbeit mit einer Datei implementiert.

Es sei darauf hingewiesen, dass die Klasse CTree hat keinen dynamischen Speicherverwaltungsmechanismus (im Gegensatz zu Klassen CList und CArrayObj). Alle Baumknoten werden mit der Speicherfreigabe entfernt.

Deklaration

   class CTree : public CTreeNode

Kopf

   #include <Arrays\Tree.mqh>

Vererbungshierarchie

  CObject

      CTreeNode

          CTree

Gruppen der Klassenmethode

Attribute

 

Root

Erhält den Stammknoten des Baumes

Das Erstellen eines neuen Elements

 

virtual CreateElement

Erstellt eine neue Instanz des Knotens

Füllung

 

Insert

Fügt einen Knoten im Baum hinzu

Löschen

 

Detach

Nimmt den angegebenen Knoten aus dem Baum aus

Delete

Löscht den angegebenen Knoten aus dem Baum

Clear

Löscht alle Baumknoten

Suche

 

Find

Sucht nach einem Knoten im Baum das gleich dem Muster ist

Eingabe/Ausgabe

 

virtual Save

Speichert Daten des Baums in einer Datei

virtual Load

Lädt Baum-Daten aus einer Datei

virtual Type

Erhält die Identifikator des Baumtyps.

Methoden geerbt von der Klasse CObject

Prev, Prev, Next, Next, Compare

Methoden geerbt von der Klasse CTreeNode

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

Bäume von abgeleiteten Klassen von CTreeNode - abgeleitete Klassen von CTree - haben praktische Anwendung.

Eine abgeleitete Klasse von CTree sollte die zugeordnete Methode Create haben, die eine neue Instanz der abgeleitete Klasse CTreeNode erstellt.

Betrachten Sie das Beispiel für eine abgeleitete Klasse CTree.

//+------------------------------------------------------------------+
//|                                                       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;
//+------------------------------------------------------------------+
//| Beschreiben von CTree abgeleitete CMyTree-Klasse.          |
//+------------------------------------------------------------------+
//| Klasse CMyTree.                                                 |
//| Zweck: Bauen und Navigation des binären Suchbaums.      |
//+------------------------------------------------------------------+
class CMyTree : public CTree
  {
public:
   //--- Methoden zur Suche nach Benutzerdaten in der Baumstruktur
   CMyTreeNode*        FindByLong(long find_long);
   //--- Methode zur Erstellung eines Baumelements
   virtual CTreeNode *CreateElement();
  };
//---
CMyTree MyTree;
//+------------------------------------------------------------------+
//| Erstellen ein neues Baumknotens.                                 |
//| INPUT:  keine.                                                 |
//| OUTPUT: Zeiger auf den neuen Baumknoten wenn OK, oder NULL.     |
//| REMARK: keine.                                                 |
//+------------------------------------------------------------------+
CTreeNode *CMyTree::CreateElement()
  {
   CMyTreeNode *node=new CMyTreeNode;
//---
   return(node);
  }
//+------------------------------------------------------------------+
//| Suche nach Element in der Liste mit Wert m_long.          |
//| INPUT:  find_long - gewünschter Wert.                |
//| OUTPUT: Zeiger auf gefundenes Listenelement oder NULL.   |
//| REMARK: keine.                                                 |
//+------------------------------------------------------------------+
CMyTreeNode* CMyTree::FindByLong(long find_long)
  {
   CMyTreeNode *res=NULL;
   CMyTreeNode *node;
//--- Baumknoten erstellen um Suchoptionen zu übertragen
   node=new CMyTreeNode;
   if(node==NULLreturn(NULL);
   node.SetLong(find_long);
//---
   res=Find(node);
   delete node;
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| Script "Testieren von Klasse CMyTree"                            |
//+------------------------------------------------------------------+
//---  Array für Initialisieren von Strings
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; //--- Ein temporärer Zeiger auf eine Instanz der CMyTreeNode-Klasse 
//---  
   printf("Start test %s.",__FILE__);
//--- Füllen MyTree mit den Instanzen der MyTreeNode-Klasse, ihre Anzahl ist extCountedNodes.
   beg_time=GetTickCount();
   for(i=0;i<extCountedNodes;i++)
     {
      node=MyTree.CreateElement();
      if(node==NULL)
        {
         //--- Notausgang
         printf("%s (%4d): create error",__FILE__,__LINE__);
         return(__LINE__);
        }
      NodeSetData(node,i);
      node.SetLong(i);
      MyTree.Insert(node);
     }
   end_time=GetTickCount();
   printf("Zeit der Füllung von MyTree %d ms.",end_time-beg_time);
//--- Einen temporären Baum TmpMyTree erstellen.
   CMyTree TmpMyTree;
//--- 50% der Baumelementen ausnehmen (alle gerade Zahle)
//--- und sie in den temporären Baum TmpMyTree hinzufügen.
   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("Zeit der Löschung von %d Elementen aus MyTree ist %d ms.",end_time-beg_time);
//--- Die ausgenommene Elementen zurückgeben
   node=TmpMyTree.Root();
   while(node!=NULL)
     {
      if(TmpMyTree.Detach(node)) MyTree.Insert(node);
      node=TmpMyTree.Root();
     }
//--- Arbeit der Methode Save(int file_handle) überprüfen;
   int file_handle;
   file_handle=FileOpen("MyTree.bin",FILE_WRITE|FILE_BIN|FILE_ANSI);
   if(file_handle>=0)
     {
      if(!MyTree.Save(file_handle))
        {
         //--- Fehler beim Schreiben in eine Datei
         //--- Notausgang
         printf("%s: Error %d in %d!",__FILE__,GetLastError(),__LINE__);
         //--- Vergessen SIe nicht die Datei zu schließen!!!
         FileClose(file_handle);
         return(__LINE__);
        }
      FileClose(file_handle);
     }
//--- Arbeit der Methode Load(int file_handle) überprüfen;
   file_handle=FileOpen("MyTree.bin",FILE_READ|FILE_BIN|FILE_ANSI);
   if(file_handle>=0)
     {
      if(!TmpMyTree.Load(file_handle))
        {
         //--- Fehler beim Lesen aus der Datei
         //--- Notausgang
         printf("%s: Error %d in %d!",__FILE__,GetLastError(),__LINE__);
         //--- Vergessen SIe nicht die Datei zu schließen!!!
         FileClose(file_handle);
         return(__LINE__);
        }
      FileClose(file_handle);
     }
//---
   MyTree.Clear();
   TmpMyTree.Clear();
//---
   printf("End test %s. OK!",__FILE__);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Funktion druckt Inhalt von node in Journal                       |
//+------------------------------------------------------------------+
void NodeToLog(CMyTreeNode *node)
  {
   printf("   %I64d,%f,'%s','%s'",
               node.GetLong(),node.GetDouble(),
               node.GetString(),TimeToString(node.GetDateTime()));
  }
//+------------------------------------------------------------------+
//| Die Funktion "füllt" node mit Zufallswerte                  |
//+------------------------------------------------------------------+
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);
  }