字典树C++实现

#ifndef _TireTree_hpp_
#define _TireTree_hpp_
#include <string>
#include <algorithm>
#include <iostream>
using std::string;

template<typename T>
class TireeTreeNode 
{
public:
	#define MAX_CHILD_NUM 26
	
	TireeTreeNode()  :  leaf(false)  {
		for(int i = 0; i < MAX_CHILD_NUM; i++)  childs[i] = 0;
	}
	
	~TireeTreeNode()  {
		for(int i = 0; i < MAX_CHILD_NUM; i++)  {
			delete childs[i] ;
			childs[i]  = 0;
		}
	}

	TireeTreeNode*  insert(char c) {
		int i = std::tolower(c) - 'a';
		if (i>= MAX_CHILD_NUM) return 0;
		if  (!childs[i]) {
			childs[i] = new TireeTreeNode();
		}
		return childs[i];
	}

	TireeTreeNode* get(char c) {
		int i = std::tolower(c) - 'a';
		if (i>= MAX_CHILD_NUM) return 0;
		return childs[i];
	}

	bool isLeaf() const { return leaf; }
	void setLeaf() { leaf = true; }
	
	void setValue(const T& v)  { value = v;} 
	const T& getValue() const { return value; }
	
private:
	TireeTreeNode* childs[MAX_CHILD_NUM];
	bool leaf;
	T value;
};

template<typename T>
class TireTree 
{
public:
	bool insert(const string& word, const T& v) {
		int n = word.length();
		TireeTreeNode<T>* node = &root;
		for(int i =0;  i < n && node; i++) {
			node = node->insert(word[i]);
		}
		
		if(node) {
			node->setLeaf();
			node->setValue(v);
		}
		return node != 0;
	}

	T get(const string& word, const T& def = T() ) {
		int n = word.length();
		TireeTreeNode<T>* node = &root;
		for (int i =0;  i < n; i++) {
			node = node->get(word[i]);
			if (!node)  return def;
		}
		return  node && node->isLeaf() ? node->getValue() : def;
	}
	
private:
	TireeTreeNode<T> root;
};

int main(int argc, char* argv[]) {
	using std::cout;
	using std::endl;
	TireTree<int> tree;
	tree.insert("macro", 1);
	tree.insert("iaaa", 2);
	tree.insert("oaaa", 2);
	tree.insert("aaa", 2);
	tree.insert("spider", 3);
	

	for(int i = 0; i < 10000; i++) {
		cout << (tree.get("aaa",1) ==2)<< endl;
		cout << (tree.get("Macro",1) == 1)<< endl;
		cout << (tree.get("iaaa",1) ==2) << endl;
		cout << (tree.get("oaaa",1) == 2 )<< endl;
		cout << (tree.get("o1aaa") == 0 )<< endl;
		cout << (tree.get("spider") == 3 )<< endl;
		cout << (tree.get("od") == 0 )<< endl;
	}
	
	
	return 0;
}

#endif 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值