实现字典树

 自己实现的字典树版本。带详细注释

package leetcode.LC;

class TrieNode{
    //4个参数设置
    //以该节点字符为结尾的字符串数目
    int end_num;
    //以该节点作为前缀字符的个数
    int prefix_num;
    //是否是叶子结点
    boolean is_leaf;
    //每个字符都含有26个字母可选
    TrieNode sub_nodes[];

    public TrieNode(){
        end_num=0;
        prefix_num=0;
        is_leaf=false;
        sub_nodes=new TrieNode[26];
    }
}

public class trieTree {
    //3个方法,插入、寻找、以某字符串开始的数量
    //初始化树
    public TrieNode root;
    public trieTree(){
        root=new TrieNode();
    }

    //插入一个字符串  关键!!
    public void insert(String str){
        //节点
        TrieNode p=root;
        //沿着字符串创建和处理树节点
        for(int i=0;i<str.length();i++){
            int ix=str.charAt(i)-'a';
            //不存在则创建一个新的节点
            if(p.sub_nodes[ix]==null){
                p.sub_nodes[ix]=new TrieNode();
                //有新的节点挂到p下面,所以p不是叶子结点了
                p.is_leaf=false;
                //新创建的节点是叶子结点
                p.sub_nodes[ix].is_leaf=true;
            }
            //选择该节点
            p=p.sub_nodes[ix];
            //以该节点为前缀的数量+1
            p.prefix_num++;
        }
        //以该节点为结尾的字符串数量+1
        p.end_num++;
    }

    //查找某个字符串是否存在
    public boolean search(String str){
        TrieNode p=root;
        for(int i=0;i<str.length();i++){
            int ix=str.charAt(i)-'a';
            //如果字符不存在,则说明不在trie树中
            if(p.sub_nodes[ix]==null){
                return false;
            }
            //
            p=p.sub_nodes[ix];
        }

        //检查最后的字符是不是结尾,看以它为结尾的字符串数量即可
        if(p.end_num>0){
            return true;
        }else{
            return false;
        }
    }

    //检查是否以str开头的字符串
    public boolean start_with(String str){
        //这个方法和search差不多
        TrieNode p=root;
        for(int i=0;i<str.length();i++){
            int ix=str.charAt(i)-'a';
            //如果字符不存在,则说明不在trie树中
            if(p.sub_nodes[ix]==null){
                return false;
            }
            p=p.sub_nodes[ix];
        }
        return true;
    }

    public static void main(String[] args) {
        trieTree tree=new trieTree();
        String words[] = {"a", "banana", "app", "appl", "ap", "apply", "apple"};
        for(String i:words){
            tree.insert(i);
        }

        System.out.println(tree.start_with("banan"));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是用C语言实现字典树的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_CHILDREN 26 struct TrieNode { int count; // 记录单词出现次数 struct TrieNode* children[MAX_CHILDREN]; }; struct Trie { struct TrieNode* root; }; struct TrieNode* create_node() { struct TrieNode* node = (struct TrieNode*)malloc(sizeof(struct TrieNode)); node->count = 0; for (int i = 0; i < MAX_CHILDREN; i++) { node->children[i] = NULL; } return node; } void insert(struct Trie* trie, char* word) { struct TrieNode* p = trie->root; for (int i = 0; i < strlen(word); i++) { int index = word[i] - 'a'; if (p->children[index] == NULL) { p->children[index] = create_node(); } p = p->children[index]; } p->count++; } int search(struct Trie* trie, char* word) { struct TrieNode* p = trie->root; for (int i = 0; i < strlen(word); i++) { int index = word[i] - 'a'; if (p->children[index] == NULL) { return 0; } p = p->children[index]; } return p->count; } int main() { struct Trie trie; trie.root = create_node(); insert(&trie, "apple"); insert(&trie, "app"); insert(&trie, "application"); int count = search(&trie, "app"); printf("单词 app 出现的次数为:%d\n", count); return 0; } ``` 以上代码中,`create_node` 函数用于创建字典树节点,`insert` 函数用于向字典树中插入单词,`search` 函数用于在字典树中查找单词出现的次数。`main` 函数则测试了该字典树在插入单词 `"apple"`、`"app"`、`"application"` 后查找单词 `"app"` 出现的次数的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值