h文件
#pragma once#include#include using namespace std;class TrieTreeNode{public: TrieTreeNode(); ~TrieTreeNode(); void Clear(); void Clear_Recu(); bool Insert(char* pChar); TrieTreeNode* operator[](char* pChar); string GetStr(); char GetChar(){return m_Char;} void SetChar(char nCh){m_Char = nCh;} bool IsWord(){return m_bWord;} void SetWord(bool bWord){m_bWord = bWord;}private: char m_Char; vector m_pVect; bool m_bWord; int m_nCount; TrieTreeNode* m_pParent;};class TrieTree{public: TrieTree(void); ~TrieTree(void); void Clear(); void Insert(char* pChar); void Release(char* pChar); TrieTreeNode* GetStrEnd(char* pChar); bool GetFrontWord(int nNum,vector & vecstr);private: TrieTreeNode m_rHead;};class TrieNodeManager{public: TrieNodeManager(){m_vecList.clear();} ~TrieNodeManager(){} TrieTreeNode* GetNode(); void Clear(); static TrieNodeManager& GetSingle() { return m_Single; }private: static TrieNodeManager m_Single; vector m_vecList;};
cpp文件
#include "TrieTree.h"/TrieNodeManager TrieNodeManager::m_Single; TrieTreeNode::TrieTreeNode():m_Char(0),m_pVect(),m_bWord(false),m_nCount(0),m_pParent(NULL){}TrieTreeNode::~TrieTreeNode(){}void TrieTreeNode::Clear(){ m_Char = 0; m_pVect.clear(); m_bWord = false; m_nCount = 0; m_pParent = NULL;}void TrieTreeNode::Clear_Recu(){ vector::iterator itr = m_pVect.begin(); while(itr != m_pVect.end()) { (*itr)->Clear_Recu(); itr ++; } Clear();}bool TrieTreeNode::Insert(char* pChar){ if(pChar == NULL || strlen(pChar) <= 0) { return false; } if(m_Char == 0) { m_Char = pChar[0]; } bool bOK = false; if(strlen(pChar) <= 1) { m_bWord = true; m_nCount ++; bOK = true; } else { if(m_Char == pChar[0] || m_Char == (char)0xFF) { vector ::iterator itr = m_pVect.begin(); while(itr != m_pVect.end()) { bOK = (*itr)->Insert(m_Char == (char)0xFF?pChar:pChar + 1); if(bOK) { break; } itr ++; } if(bOK == false) { TrieTreeNode* newNode = TrieNodeManager::GetSingle().GetNode(); newNode->Clear(); newNode->Insert(m_Char == (char)0xFF?pChar:pChar + 1); newNode->m_pParent = this; m_pVect.push_back(newNode); bOK = true; } } } return bOK; }TrieTreeNode* TrieTreeNode::operator[](char* pChar){ if(pChar == NULL) { return NULL; } cout< < ::iterator itr = m_pVect.begin(); while(itr != m_pVect.end()) { TrieTreeNode& rNode = *(*itr); if(rNode.GetChar() == *pChar) { return rNode[pChar + 1]; } itr ++; } return NULL;}string TrieTreeNode::GetStr(){ string str = ""; if(m_pParent) { str += m_Char; str += m_pParent->GetStr(); } return str;}TrieTree::TrieTree(void){ m_rHead.Clear(); m_rHead.SetChar(0xFF);}TrieTree::~TrieTree(void){ TrieNodeManager::GetSingle().Clear();}void TrieTree::Clear(){ m_rHead.Clear_Recu(); m_rHead.SetChar(0xFF);}void TrieTree::Insert(char* pChar){ if(pChar == NULL || strlen(pChar) <= 0) { return; } m_rHead.Insert(pChar);}void TrieTree::Release(char* pChar){ Insert(pChar); TrieTreeNode* pNode = GetStrEnd(pChar); if(pNode) { pNode->SetWord(false); string str = pNode->GetStr(); string tmp = str; str = ""; for(string::reverse_iterator itr = tmp.rbegin();itr < tmp.rend();itr ++) { str += *itr; } cout< < & vecstr){ return false;}///TrieTreeNode* TrieNodeManager::GetNode(){ TrieTreeNode* newNode = new TrieTreeNode(); m_vecList.push_back(newNode); return newNode;}void TrieNodeManager::Clear(){ for(int i=0;i
main
#include "TrieTree.h"int main(){ TrieTree rTree; rTree.Insert("fuck,ou"); rTree.Insert("black"); rTree.Release("black"); return 0;}