键树

作者: 李连毛 | 来源:发表于2017-02-08 17:42 被阅读19次

    键树的定义

    键树听起来高端,其实也没有想象中的那么腻害,他其实就像字典一样,有个根root,然后根下面有你存放的字母,字母下面还有字母,就像查字典的过程,例如下图,我查CAO,先查C,然后查,最后查O,下面有个$标识符,标志这个单词结束了。

    键树示例图

    键树代码的实现

    键树的主要构成是next节点集合 和 标识符。每次查询相当于多叉树,找到最后标识符截止。代码是借鉴书本的,使用次数不多,不熟练,如有不当之处,希望指正。代码也放在了github

    代码主要分几个部分,Trie树的插入,销毁,查找。
    其中插入部分的代码:先获取root根节点,开始逐个遍历传入的单词每个字母,如果该字母在这个节点的next数组中已经存在,则向下移动location = location->next[word-'a'];*,如果不存在,则传建一个节点,添加到next数组中。
    下面是查找部分:和插入部分类似,不停的遍历,遍历出来以后检查location是不是空,且是不是遍历到了结尾。

    //
    //  main.cpp
    //  Page276_Trie树
    //
    //  Created by 李林 on 2017/2/8.
    //  Copyright © 2017年 lee. All rights reserved.
    //
    
    #include <iostream>
    using namespace std;
    
    const int branchNum = 26;
    /*
     Trie树:节点中不设数据域
     每个节点有个标志位表示是否是一个字符串(到字符串的末尾)
     每个节点保存其子女的节点指针
     */
    struct Trie_node{
        bool isStr;                 // 记录此处是否构成一个串
        Trie_node *next[branchNum]; // 指向各个子树的指针
        Trie_node() : isStr(false) {
            memset(next, NULL, sizeof(next));
        }
    };
    
    class Trie{
    public:
        Trie(){
            root = new Trie_node();
        }
        
        void insert(const char* word){
            Trie_node *location = root;
            while(*word){
                if(location->next[*word-'a'] == NULL){  // 不存在则新建立一个节点
                    Trie_node *temp = new Trie_node();
                    location->next[*word-'a'] = temp;
                }
                location = location->next[*word-'a'];   // 指针向下移动
                word++;
            }
            location->isStr = true;                     // 到达底部,标记为一个串
        }
        
        bool search(char* word){
            Trie_node *location = root;
            while(*word && location){
                location = location->next[*word-'a'];
                word++;
            }
            return (location != NULL && location->isStr);
        }
        
        void deleteTrie(Trie_node *root){
            for(int i=0; i<branchNum; i++){
                if(root->next[i] != NULL)
                    deleteTrie(root->next[i]);
            }
            delete root;
        }
        
        Trie_node* getTrie(){
            return root;
        }
        
    private:
        Trie_node *root;
    };
    
    int main(int argc, const char * argv[]) {
        
        Trie tree;
        tree.insert("hello");
        tree.insert("world");
        bool result = tree.search("world");
        printf("%d", result); 
        
        return 0;
    }
    

    相关文章

      网友评论

      本文标题:键树

      本文链接:https://www.haomeiwen.com/subject/occbittx.html