键树

作者: 李连毛 | 来源:发表于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;
}

相关文章

  • 键树

    键树的定义 键树听起来高端,其实也没有想象中的那么腻害,他其实就像字典一样,有个根root,然后根下面有你存放的字...

  • Trie(前缀树、字典树)

    定义 trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是...

  • 树:23树和红黑树

    23树和红黑树 1. 2-3 查找树 1.1 2-3树定义 2-节点,含有一个键和两条链接。3-节点,含有两个键和...

  • MySQL面试题 | 附答案解析(六)

    16. B树和B+树的区别 (1)在B树中,你可以将键和值存放在内部节点和叶子节点;但在B+树中,内部节点都是键,...

  • 键树查找法

    定义: 一棵度大于等于2的树,树中的每个结点中只含有组成关键字的符号。 例如,若关键字是数值,则结点中只包含一个数...

  • 以太坊中的Merkle Patricia Tree(1):基本概

    1. Trie/Radix树 Trie树,又称 前缀树或字典树 ,是一种有序树,用于保存关联数组. 其中的键通常...

  • 灵活&&高效的符号表--二叉查找树

    一丶定义 一颗二叉查找树是一颗二叉树,其中每个结点的键都大于其任左子树任意结点的键而小于右子树任意结点的键。如标题...

  • atom快捷键大全-转发

    快捷键文件切换快捷键 快捷键的功能cmd-shift-o 打开目录cmd- 显示或隐藏目录树ctrl-0...

  • 算法 -- 红黑树

    2-3 树 二叉树又叫 2-树 2- 节点:一个键,两条链接 3- 节点:两个键,三条链接(中间链接的子节点大小在...

  • 2-3树

    定义 一棵2-3查找树或为一棵空树,或由以下节点组成:2-节点:含有一个键和两条链接,左链接指向的2-3树中的键都...

网友评论

本文标题:键树

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