CTreeNode

Класс CTreeNode является классом узла двоичного дерева CTree.

Описание

Класс CTreeNode обеспечивает возможность работы с узлами двоичного дерева CTree. В классе реализованы возможности навигации по дереву. Кроме того, реализованы методы работы с файлом.

Декларация

   class CArrayObj : public CObject

Заголовок

   #include <Arrays\TreeNode.mqh>

Иерархия наследования

  CObject

      CTreeNode

Прямые потомки

CTree

Методы класса по группам

Атрибуты

 

Owner

Получает/устанавливает указатель узла-владельца

Left

Получает/устанавливает указатель левого узла

Right

Получает/устанавливает указатель правого узла

Balance

Получает баланс узла

BalanceL

Получает баланс левой подветви узла

BalanceR

Получает баланс правой подветви узла

Создание нового элемента

 

CreateSample

Создает новый экземпляр узла

Сравнение

 

RefreshBalance

Пересчитывает баланс узла

Поиск

 

GetNext

Получает указатель следующего узла

Ввод/вывод

 

SaveNode

Сохраняет данные узла в файл

LoadNode

Загружает данные узла из файла

virtual Type

Получает идентификатор типа узла

Методы унаследованные от CObject

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

Практическое применение имеют деревья потомков класса CTreeNode.

Потомок класса CTreeNode должен иметь переопределенные методы: CreateSample, создающий новый экземпляр класса-потомка CTreeNode, Compare, сравнивающий значения ключевых полей класса-потомка CTreeNode, Type (при необходимости идентификации узла), SaveNode и LoadNode (при необходимости работы с файлом).

Рассмотрим пример класса-потомка 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>
//+------------------------------------------------------------------+
//| Описываем класс CMyTreeNode производный от CTreeNode.            |
//+------------------------------------------------------------------+
//| Класс CMyTreeNode.                                               |
//| Назначение: Класс элемента двоичного дерева.                     |
//|             Потомок класса CTreeNode.                            |
//+------------------------------------------------------------------+
class CMyTreeNode : public CTreeNode
  {
protected:
   //--- данные пользователя
   long              m_long;            // ключевое поле типа long
   double            m_double;          // переменная пользователя типа double
   string            m_string;          // переменная пользователя типа string
   datetime          m_datetime;        // переменная пользователя типа datetime
 
public:
                     CMyTreeNode();
   //--- методы доступа к данным пользователя
   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;  }
   //--- методы работы с файлами
   virtual bool      Save(int file_handle);
   virtual bool      Load(int file_handle);
protected:
   virtual int       Compare(const CObject *node,int mode);
   //--- метод создания экземпляра класса
   virtual CTreeNode* CreateSample();
  };
//+------------------------------------------------------------------+
//| Конструктор класса CMyTreeNode.                                  |
//| INPUT:  нет.                                                     |
//| OUTPUT: нет.                                                     |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
void CMyTreeNode::CMyTreeNode()
  {
//--- инициализация данных пользователя
   m_long        =0;
   m_double      =0.0;
   m_string      ="";
   m_datetime    =0;
  }
//+------------------------------------------------------------------+
//| Сравнение с другим узлом дерева по указанному алгоритму.         |
//| INPUT:  node - элемент массива для сравнения,                    |
//|         mode - идентификатор алгоритма сравнения.                |
//| OUTPUT: результат сравнения (>0,0,<0).                           |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
int CMyTreeNode::Compare(const CObject *node,int mode)
  {
//--- параметр mode игнорируется, т.к. агоритм построения дерева единственный
   int res=0;
//--- явное преобразование типа
   CMyTreeNode *n=node;
   res=(int)(m_long-n.m_long);
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| Создание нового экземпляра класса.                               |
//| INPUT:  нет.                                                     |
//| OUTPUT: указатель на новый экземпляр класса CMyTreeNode.         |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
CTreeNode* CMyTreeNode::CreateSample()
  {
   CMyTreeNode *result=new CMyTreeNode;
//---
   return(result);
  }
//+------------------------------------------------------------------+
//| Запись данных узла дерева в файл.                                |
//| INPUT:  file_handle -хендл ранее открытого для записи файла.     |
//| OUTPUT: true если ОК, иначе false.                               |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CMyTreeNode::Save(int file_handle)
  {
   uint i=0,len;
//--- проверки
   if(file_handle<0) return(false);
//--- собственно запись данных пользователя
//--- запись переменной пользователя типа long
   if(FileWriteLong(file_handle,m_long)!=sizeof(long))          return(false);
//--- запись переменной пользователя типа double
   if(FileWriteDouble(file_handle,m_double)!=sizeof(double))    return(false);
//--- запись переменной пользователя типа string
   len=StringLen(m_string);
//--- запись длины строки
   if(FileWriteInteger(file_handle,len,INT_VALUE)!=INT_VALUE)   return(false);
//--- запись собственно строки
   if(len!=0 && FileWriteString(file_handle,m_string,len)!=len) return(false);
//--- запись переменной пользователя типа datetime
   if(FileWriteLong(file_handle,m_datetime)!=sizeof(long))      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Чтение данных узла дерева из файла.                              |
//| INPUT:  file_handle -хендл ранее открытого для чтения файла.     |
//| OUTPUT: true если ОК, иначе false.                               |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CMyTreeNode::Load(int file_handle)
  {
   uint i=0,len;
//--- проверки
   if(file_handle<0) return(false);
//--- собственно чтение
   if(FileIsEnding(file_handle)) return(false);
//--- чтение переменной пользователя типа char
//--- чтение переменной пользователя типа long
   m_long=FileReadLong(file_handle);
//--- чтение переменной пользователя типа double
   m_double=FileReadDouble(file_handle);
//--- чтение переменной пользователя типа string
//--- чтение длины строки
   len=FileReadInteger(file_handle,INT_VALUE);
//--- чтение собственно строки
   if(len!=0) m_string=FileReadString(file_handle,len);
   else       m_string="";
//--- чтение переменной пользователя типа datetime
   m_datetime=FileReadLong(file_handle);
//---
   return(true);
  }