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);

  }