您的位置:首页 > 其它

Ternary Search Trees 三分搜索树-源码

2012-04-16 22:16 357 查看
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

class TernarySearchTree
{

private:

struct tnode
{
char s;
tnode *lkid, *mkid, * rkid;
bool mbEnd;

tnode(char is)
{
s = is;
lkid = NULL;
mkid = NULL;
rkid = NULL;
mbEnd = false;

}

};
tnode* root;
private:

void hInsert(tnode** p, const char *s, char* originalS)
{
if(*p == NULL)
{
*p = new tnode(*s);
}

if((*p)->s > *s)
{
hInsert(&((*p)->lkid), s, originalS);
}
else if((*p)->s < *s)
{
hInsert(&((*p)->rkid), s, originalS);
}
else
{
if(*(s + 1) == '\0')
{
(*p)->mbEnd = true;
(*p)->mkid = (tnode*)(originalS);
return;
}
hInsert(&((*p)->mkid), s + 1, originalS);
}

}

void hBuildTST(vector<string>& ivString, int istart, int iend)
{
if(istart > iend) return;

int mid = (istart + iend)/ 2;

Insert(ivString[mid].c_str());

hBuildTST(ivString, istart, mid -1);

hBuildTST(ivString, mid + 1, iend);

}

void hTraverse(tnode* inode)
{
if(inode == NULL) return;

hTraverse(inode->lkid);
if(inode->mbEnd) cout << (char*)(inode->mkid) << endl;
else	hTraverse(inode->mkid);

hTraverse(inode->rkid);
}

public:

TernarySearchTree()
{
root = NULL;
}

void Insert(const char *s)
{
int slength = strlen(s);
char* CopyS = new char[slength + 1];
memcpy(CopyS, s, sizeof(char)* (slength+1));
hInsert(&root, s, CopyS);
};

void BuildTST(vector<string>& ivString)
{

sort(ivString.begin(), ivString.end());

hBuildTST(ivString, 0, ivString.size() - 1);
}

bool find(const char *s)
{
if(root == NULL)
return false;
const char* lps = s;

tnode* lp = root;

while(true)
{

if(lp->s < *lps)
{
lp = lp->rkid;
}
else if(lp->s > *lps)
{
lp = lp->lkid;
}
else
{

if(*(lps + 1) == '\0' && lp->mbEnd)
return true;

lp = lp->mkid;
lps++;
}

if(lp == NULL)
return false;

}
return false;

}

void Traverse()
{
hTraverse(root);
}

};
// ternary_Search_tree.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "TernarySearchTree.h"
#include <iostream>
#include <string>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
TernarySearchTree lTST;

char* lTestString[] = {"as", "at",

"be", "by", "he", "in",

"is", "it", "of", "on",

"or", "to"};

//for(int i = 0; i< sizeof(lTestString)/sizeof(char*); i++)

//	lTST.Insert(lTestString[i]);

vector<string> lvTestString;

for(int i = 0; i< sizeof(lTestString)/sizeof(char*); i++)

lvTestString.push_back(string(lTestString[i]));

lTST.BuildTST(lvTestString);

lTST.Traverse();

string input;
while(cin >> input)
{

if(lTST.find(input.c_str()))

{

cout << "find it" << endl;

}

else

{

cout << "can not find it" << endl;

}

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: