CTreeNode

类 CTreeNode 是 CTree 二叉树的节点类。

描述

类 CTreeNode 可供操作 CTree 二叉树的节点。在类中, 实现了遍历二叉树选项。此外, 还实现了文件操作方法。

声明

   class CTreeNode : 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 (如果有必要标识一个节点), SaveNodeLoadNode (如果有必要操作文件)。

我们来研究一个 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>
//+------------------------------------------------------------------+
//| 描述 自 CTreeNode 派生的类。                           |
//+------------------------------------------------------------------+
//| 类 CMyTreeNode。                                              |
//| 目的: 二叉树元素类。                     |
//|             类 CTreeNode 的子类。                      |
//+------------------------------------------------------------------+
class CMyTreeNode : public CTreeNode
  {
protected:
   //--- 用户数据
   long              m_long;            // 长整数型关键字段
   double            m_double;          // 双精度型自定义变量
   string            m_string;          // 字符串型自定义变量
   datetime          m_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 类构造器。                                  |
//| 输入:  无。                                                   |
//| 输出: 无。                                                   |
//| 备注: 无。                                                   |
//+------------------------------------------------------------------+
void CMyTreeNode::CMyTreeNode()
  {
//--- 初始化用户数据
   m_long        =0;
   m_double      =0.0;
   m_string      ="";
   m_datetime    =0;
  }
//+------------------------------------------------------------------+
//| 按照指定算法比较其它三个节点。  |
//| 输入:  节点 - 比较的元素数组,                         |
//|         mode - 比较算法标识符。              |
//| 输出: 比较结果 (>0,0,<0)。                         |
//| 备注: 无。                                                   |
//+------------------------------------------------------------------+
int CMyTreeNode::Compare(const CObject *node,int mode)
  {
//--- 参数 mode 被忽略, 因为数构造算法只有一个
   int res=0;
//--- 显式类型转换
   CMyTreeNode *n=node;
   res=(int)(m_long-n.m_long);
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| 创建新的类实例。                               |
//| 输入:  无。                                                   |
//| 输出: 类 CMyTreeNode 的新实例指针。         |
//| 备注: 无。                                                   |
//+------------------------------------------------------------------+
CTreeNode* CMyTreeNode::CreateSample()
  {
   CMyTreeNode *result=new CMyTreeNode;
//---
   return(result);
  }
//+------------------------------------------------------------------+
//| 写树节点数据至文件。                                 |
//| 输入:  file_handle -以写模式打开的二进制文件句柄。   |
//| 输出: 如果成功 true, 否则 false。                            |
//| 备注: 无。                                                   |
//+------------------------------------------------------------------+
bool CMyTreeNode::Save(int file_handle)
  {
   uint i=0,len;
//--- 检查
   if(file_handle<0) return(false);
//--- 写用户数据
//--- 写长整数型自定义变量
   if(FileWriteLong(file_handle,m_long)!=sizeof(long))          return(false);
//--- writing custom variable of type double
   if(FileWriteDouble(file_handle,m_double)!=sizeof(double))    return(false);
//--- 写字符串型自定义变量
   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);
//--- 写日期时间型自定义变量
   if(FileWriteLong(file_handle,m_datetime)!=sizeof(long))      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| 从文件里读书节点数据。                                |
//| 输入:  file_handle -以读模式打开的二进制文件句柄。   |
//| 输出: 如果成功 true, 否则 false。                            |
//| 备注: 无。                                                   |
//+------------------------------------------------------------------+
bool CMyTreeNode::Load(int file_handle)
  {
   uint i=0,len;
//--- 检查
   if(file_handle<0) return(false);
//--- reading
   if(FileIsEnding(file_handle)) return(false);
//--- 读字符型自定义变量
//--- 读长整数型自定义变量
   m_long=FileReadLong(file_handle);
//--- 读双精度型自定义变量
   m_double=FileReadDouble(file_handle);
//--- 读字符串型自定义变量
//--- 读字符串长度
   len=FileReadInteger(file_handle,INT_VALUE);
//--- 读字符串
   if(len!=0) m_string=FileReadString(file_handle,len);
   else       m_string="";
//--- 读日期时间型自定义变量
   m_datetime=FileReadLong(file_handle);
//---
   return(true);
  }