#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; }