最简单的trie树

#include <iostream>
#include <string>

using namespace std;

class TrieTree{
	struct TrieNode{
		bool isStr;
		TrieNode* child[26];
		TrieNode():isStr(false){ 
			for (int i = 0; i < 26; i++)
				child[i] = NULL;
		}
	};
	TrieNode* root;
public:
	TrieTree();
	~TrieTree();
	void insert(string str);
	void remove(string str);
	bool search(string str);
};

TrieTree::TrieTree()
{
	root = new TrieNode();
}

void TrieTree::insert(string str)
{
	int index = 0;
	TrieNode *pNode = root;
	while (index < str.size()){
		if (pNode->child[str[index]-'a'] == NULL){
			pNode->child[str[index] - 'a'] = new TrieNode();
		}
		pNode = pNode->child[str[index] - 'a'];
		index++;
	}
	pNode->isStr = true;
}

void TrieTree::remove(string str)
{
	bool isLeaf = true;
	int index = 0;
	TrieNode *pPre = NULL;
	TrieNode *pNode = root;
	while (index < str.size() && pNode){
		pPre = pNode;
		pNode = pNode->child[str[index] - 'a'];
		index++;
	}
	if (pNode){
		for (int i = 0; i < 26; i++){
			if (pNode->child[i]){
				isLeaf = false;
				break;
			}	
		}
		if (pPre&&isLeaf){
			delete pNode;
			pPre->child[str[index - 1] - 'a'] = NULL;
		}
		else{
			pNode->isStr = false;
		}
	}
}

bool TrieTree::search(string str)
{
	int index = 0;
	TrieNode *pNode = root;
	while (index<str.size()&&pNode){
		pNode = pNode->child[str[index] - 'a'];
		index++;
	}
	if (pNode&&pNode->isStr)
		return true;
	return false;
}

TrieTree::~TrieTree()
{

}

int main(void)
{
	TrieTree tree;
	
	tree.insert("a");
	tree.insert("abcd");
	tree.insert("ab");
	tree.insert("bd");
	tree.insert("bcd");
	tree.insert("bdcc");
	tree.insert("b");
	tree.insert("");
	tree.remove("abcde");
	cout << tree.search("ba") << endl;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值