CTreeNode

CTreeNode는 CTree 이진 트리 노드의 클래스입니다.

Description

CTreeNode는 CTree 이진 트리의 노드로 작업할 수 있는 기능을 제공합니다. 트리를 통한 탐색 옵션은 클래스에서 구현됩니다. 또한 파일로 작업하는 방법도 구현됩니다.

Declaration

   class CTreeNode : public CObject

Title

   #include <Arrays\TreeNode.mqh>

상속 계층

  CObject

      CTreeNode

직계 종속

CTree

그룹별 클래스 메서드

Attributes

 

Owner

소유자 노드의 포인터를 가져오거나 설정합니다

Left

왼쪽 노드의 포인터를 가져오거나 설정합니다

Right

오른쪽 노드의 포인터를 가져오거나 설정합니다

Balance

노드 밸런스를 가져옵니다

BalanceL

노드의 왼쪽 하위 분기의 밸런스를 가져옵니다

BalanceR

노드의 오른쪽 하위 분기의 균형을 가져옵니다

새 요소 작성

 

CreateSample

새 노드 인스턴스를 작성합니다

Comparison

 

RefreshBalance

노드 밸런스를 다시 계산합니다

Search

 

GetNext

다음 노드의 포인터를 가져옵니다

Input/Output

 

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 2000-2024, MetaQuotes Ltd. |
//| www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
//---
#include <Arrays\TreeNode.mqh>
//+------------------------------------------------------------------+
//| CTreeNode에서 파생된 CMyTreeNode 클래스를 설명합니다.               |
//+------------------------------------------------------------------+
//| Class 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: none.                                                    |
//| 비고: 없음.                                                    |
//+------------------------------------------------------------------+
void CMyTreeNode::CMyTreeNode()
  {
//--- 사용자 데이터 초기화
   m_long        =0;
   m_double      =0.0;
   m_string      ="";
   m_datetime    =0;
  }
//+------------------------------------------------------------------+
//| 지정된 알고리즘으로 다른 트리 노드와 비교.    |
//| INPUT:  노드 - 비교할 트리 요소,                          |
//|         모드 - 비교 알고리즘의 식별자.               |
//| OUTPUT: 비교 결과 (>0,0,<0).                          |
//| 비고: 없음.                                                    |
//+------------------------------------------------------------------+
int CMyTreeNode::Compare(const CObject *node,int mode)
  {
//--- 트리 생성 알고리즘이 유일하기 때문에 모드 매개 변수가 무시됩니다
   int res=0;
//--- 명시적 유형 캐스팅
   CMyTreeNode *n=node;
   res=(int)(m_long-n.m_long);
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| 새 클래스 인스턴스 만들기.                                |
//| INPUT:  없음.                                                    |
//| OUTPUT: CMyTreeNode 클래스의 새 인스턴스에 대한 포인터.          |
//| 비고: 없음.                                                    |
//+------------------------------------------------------------------+
CTreeNode* CMyTreeNode::CreateSample()
  {
   CMyTreeNode *result=new CMyTreeNode;
//---
   return(result);
  }
//+------------------------------------------------------------------+
//| 파일에 트리 노드 데이터를 씁니다.                                  |
//| INPUT:  file_handle -쓰기 위해 미리 열린 파일의 핸들.    |
//| OUTPUT: 정상이면 true, 그렇지 않으면 false입니다.                             |
//| 비고: 없음.                                                    |
//+------------------------------------------------------------------+
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);
//--- 문자열 유형의 커스텀 변수 쓰기
   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입니다.                             |
//| 비고: 없음.                                                    |
//+------------------------------------------------------------------+
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 타입의 커스텀 변수 읽기
//--- string 길이 읽기
   len=FileReadInteger(file_handle,INT_VALUE);
//--- string 읽기
   if(len!=0) m_string=FileReadString(file_handle,len);
   else       m_string="";
//--- datetime 유형의 커스텀 변수 읽기
   m_datetime=FileReadLong(file_handle);
//---
   return(true);
  }