一个多叉树 (10叉数),匹配数字组成的字符串,比如123
可以查找父节点,比如12是123的父节点,
也可以查找子节点
组成的树为 1->2->3
struct ChoiceDetail
{
char blockid[50];
vector<int> setstockindex;
ChoiceDetail()
{
memset(blockid, 0, sizeof(blockid));
setstockindex.clear();
}
};
class ChoiceBlock
{
typedef ChoiceDetail* PData;
class Leaf
{
public:
Leaf();
~Leaf();
public:
void PushBackData(vector<int> &setStocks);
void PushBackChildData(vector<int> &setStocks);
bool CheckHaveChildNode();
public:
ChoiceDetail *m_pData;
Leaf *m_arrLeafs[10];
};
public:
ChoiceBlock();
~ChoiceBlock();
void Insert(const char* blockid, PData data);
void Load(vector<ChoiceDetail> &vecBlocks);
bool Match(const char* blockid, vector<int> &setStocks);
public:
Leaf* m_arrLeafs[10];
private:
void Release(Leaf *lf);
};
#include "QuoteCommon.h"
ChoiceBlock::Leaf::Leaf()
{
memset(m_arrLeafs, 0, sizeof(m_arrLeafs));
m_pData = NULL;
}
ChoiceBlock::Leaf::~Leaf()
{
}
void ChoiceBlock::Leaf::PushBackData(vector<int> &setStocks)
{
if (m_pData == NULL)
return;
if(m_pData->setstockindex.size() == 0)
{
return;
}
int iFirstIndex = m_pData->setstockindex[0];
for(int i=0; i<m_pData->setstockindex.size(); ++i)
{
setStocks.push_back(m_pData->setstockindex[i]);
}
}
bool ChoiceBlock::Leaf::CheckHaveChildNode()
{
for(int i=0; i<10; ++i)
{
if(m_arrLeafs[i] != NULL)
{
return true;
}
}
return false;
}
void ChoiceBlock::Leaf::PushBackChildData(vector<int> &setStocks)
{
if(m_pData != NULL)
{
PushBackData(setStocks);
}
if(CheckHaveChildNode() == false)
{
return;
}
Leaf **clfs = m_arrLeafs; //遍历子节点,把子节点的数据都加进来
for (int i = 0; i<10; ++i)
{
if (clfs[i] != NULL)
{
clfs[i]->PushBackChildData(setStocks);
}
}
}
ChoiceBlock::ChoiceBlock()
{
memset(m_arrLeafs, 0, sizeof(m_arrLeafs));
}
ChoiceBlock::~ChoiceBlock()
{
for(int i=0; i<10; ++i)
{
if(m_arrLeafs[i] != NULL)
{
Release(m_arrLeafs[i]);
}
}
}
void ChoiceBlock::Release(Leaf *lf) //用递归释放
{
if(lf == NULL)
{
return;
}
for(int i=0; i<10; ++i)
{
if(lf->m_arrLeafs[i] != NULL)
{
Release(lf->m_arrLeafs[i]);
}
}
delete lf;
lf = NULL;
}
void ChoiceBlock::Load(vector<ChoiceDetail> &vecBlocks)
{
for(unsigned int i=0; i<vecBlocks.size(); ++i)
{
Insert(vecBlocks[i].blockid, &(vecBlocks[i]));
}
}
void ChoiceBlock::Insert(const char* blockid, PData data)
{
if (blockid == NULL)
{
LOG_ERROR("ChoiceBlock Insert blockid is NULL");
return;
}
Leaf **lfs = m_arrLeafs;
Leaf *cur = NULL;
for(; *blockid != '\0'; ++blockid)
{
int num = *blockid - '0';
if(num < 0 || num >9)
{
return;
}
if(lfs[num] == NULL)
{
lfs[num] = new Leaf();
}
cur = lfs[num];
lfs = cur->m_arrLeafs;
}
if(cur != NULL)
{
cur->m_pData = data;
}
}
bool ChoiceBlock::Match(const char* blockid, vector<int> &setStocks)
{
Leaf **lfs = m_arrLeafs;
Leaf *cur = NULL;
for(; *blockid != '\0'; ++blockid)
{
int num = *blockid - '0';
if(num <0 || num >9)
{
return false;
}
if(lfs[num] == NULL)
{
return false;
}
cur = lfs[num];
lfs = cur->m_arrLeafs;
}
if(cur != NULL)
{
cur->PushBackChildData(setStocks); //当前节点匹配的数据
}
}