#pragma once
#include <vector>
#include <iostream>
using namespace std;
class Chess_MoveTree
{
//二维数组存的多叉树,标号从0开始
public:
Chess_MoveTree(void);
~Chess_MoveTree(void);
//生成多叉树,默认是生成12层的4叉树,约6百万个节点
void Create(const int in_iTreePath = 4, const int in_iLayerNum = 12);
int Path() { return m_iTreePath; }
int Size() { return MoveValue.size(); }
bool GetItemData(const int in_ID, int& out_dValue);
//获得子结点ID,in_ID从0, in_iChildPos从0开始
bool GetChildID(const int in_ID, const int in_iChildPos, int& out_iChildID);
//获得子结点ID,in_ID从0, in_iChildPos从0开始
bool GetChildData(const int in_ID, const int in_iChildPos, int& out_dChildValue);
void Show();
private:
void Show(const int in_ID, const int in_Layer);
int m_iTreePath;
vector<int> MoveValue;
};
////////////////////////////////////////////////////////////////
#include "Chess_MoveTree.h"
#include <math.h>
#include <time.h>
Chess_MoveTree::Chess_MoveTree(void)
{
MoveValue.clear();
m_iTreePath = 0;
srand(time(0));
}
Chess_MoveTree::~Chess_MoveTree(void)
{
MoveValue.clear();
}
void Chess_MoveTree::Create(const int in_iTreePath, const int in_iLayerNum)
{
m_iTreePath = in_iTreePath;
MoveValue.clear();
int iTreeSize = (pow((double)m_iTreePath,in_iLayerNum)-1.0)/(m_iTreePath-1.0);
for(int i=0; i<iTreeSize; i++)
{
int dValue = rand()%10000-5000;
MoveValue.push_back(dValue);
}
}
bool Chess_MoveTree::GetItemData(const int in_ID, int& out_dValue)
{
if( in_ID <0 || in_ID>= Size())
return false;
out_dValue = MoveValue[in_ID];
return true;
}
bool Chess_MoveTree::GetChildID(const int in_ID, const int in_iChildPos, int& out_iChildID)
{
int iTemp = in_ID*m_iTreePath+(in_iChildPos+1);
if( iTemp <0 || iTemp>= Size())
return false;
out_iChildID = iTemp;
return true;
}
bool Chess_MoveTree::GetChildData(const int in_ID, const int in_iChildPos, int& out_dChildValue)
{
int iTemp = in_ID*m_iTreePath+(in_iChildPos+1);
if( iTemp <0 || iTemp>= Size())
return false;
out_dChildValue = MoveValue[iTemp];
return true;
}
void Chess_MoveTree::Show()
{
Show(0,1);
}
void Chess_MoveTree::Show(const int in_ID, const int in_Layer)
{
int dValue;
if( GetItemData(in_ID, dValue))
{
for(int i=0; i<in_Layer; i++)
cout<<" ";
cout<<"("<<in_Layer<<"): ";
cout<<dValue<<endl;
for(int i=0; i<m_iTreePath; i++)
{
int iChildID = 0;
if( GetChildID(in_ID,i, iChildID))
Show(iChildID, in_Layer+1);
}
}
}
本文介绍了一种多叉树的生成与操作方法,包括创建、获取节点数据、子节点ID和值等基本操作。
177万+

被折叠的 条评论
为什么被折叠?



