Java 实现字典树 增加、删除、查找 简单易懂!

代码理解见注释!!!非常简单易懂!!

import java.util.HashMap;

public class DictTreeTest {

    private TreeNode root;

    public DictTreeTest(){
        root = new TreeNode();
    }
    class TreeNode{
        private int path;//该字母被使用次数
        private int end;//结束字母为0 表示该单词没有记录或者已经被删除
        private HashMap<Character,TreeNode> map;//子节点
        public TreeNode(){
            this.path = 0;
            this.end = 0;
            this.map = new HashMap<>();
        }
    }

    //search
    public boolean search(String word){
        if(word == null)
            return false;

        char[] chars = word.toCharArray();
        TreeNode node = root;
        for(int i=0;i<chars.length;i++){//循环遍历字符串所有字符 全部存在才可以
            if(node.map.get(chars[i]) == null){
                return false;
            }
            node = node.map.get(chars[i]);
        }
        return node.end != 0;//判断结束字符是否为0
    }

    //add
    public void add(String word){
        if(word == null)
            return;

        char[] chars = word.toCharArray();
        TreeNode node = root;
        for(int i=0;i<chars.length;i++){//循环遍历字符串所有字符 若某字符不存在 则新建子节点
            if(node.map.get(chars[i]) == null){
                node.map.put(chars[i],new TreeNode());
            }
            node = node.map.get(chars[i]);
            node.path++;//该字符的使用次数加一
        }
        node.end++;//该字符串的结尾字符数加一
    }

    //delete
    public void delete(String word){
        if(search(word)){//判断字符是否存在 存在继续!
            char[] chars = word.toCharArray();
            TreeNode node = root;
            for(int i=0;i<chars.length;i++){//循环遍历字符串所有字符 一次删除
                if(node.map.get(chars[i]).path-- == 1){//单词的使用次数减一 若该单词只有一次使用记录 则直接置空该单词的子节点并返回
                    node.map.put(chars[i],new TreeNode());
                    return;
                }
                node = node.map.get(chars[i]);
            }
            node.end--;//单词的结尾字符数减一
        }
    }

    public static void main(String[] args){
        DictTreeTest dictTree = new DictTreeTest();
        String str1 = "zhugege";
        String str2 = "zhugege";
        dictTree.add(str1);
        dictTree.add(str2);
        System.out.println(dictTree.search("zhu"));
        System.out.println(dictTree.search("zhugege"));
        dictTree.delete("zhugege");
        System.out.println(dictTree.search("zhugege"));
        dictTree.delete("zhugege");
        System.out.println(dictTree.search("zhugege"));
    }
}

测试结果图:
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
字典树Java实现可以使用递归来构建。首先需要定义一个TrieNode类,其中包含一个Map用于存储子节点,以及一个布尔值表示当前节点是否是一个单词的结尾。然后,定义一个Trie类来维护根节点。在Trie类中实现insert、search和startsWith方法。 下面是一个简单字典树Java代码实现示例: ```java class TrieNode { Map<Character, TrieNode> children; boolean isEndOfWord; public TrieNode() { children = new HashMap<>(); isEndOfWord = false; } } class Trie { private TrieNode root; public Trie() { root = new TrieNode(); } public void insert(String word) { TrieNode current = root; for (int i = 0; i < word.length(); i++) { char ch = word.charAt(i); TrieNode node = current.children.get(ch); if (node == null) { node = new TrieNode(); current.children.put(ch, node); } current = node; } current.isEndOfWord = true; } public boolean search(String word) { TrieNode current = root; for (int i = 0; i < word.length(); i++) { char ch = word.charAt(i); TrieNode node = current.children.get(ch); if (node == null) { return false; } current = node; } return current.isEndOfWord; } public boolean startsWith(String prefix) { TrieNode current = root; for (int i = 0; i < prefix.length(); i++) { char ch = prefix.charAt(i); TrieNode node = current.children.get(ch); if (node == null) { return false; } current = node; } return true; } } ``` 这是一个简单的Trie字典树Java代码实现,其中包括了插入、查询和查询前缀三个常用操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值