Trie树 Java实现 内部类

本文详细介绍了一种使用HashMap实现的Trie树数据结构,包括其核心组件Node和内部类Data的设计。Node作为Trie树的基本单元,通过HashMap存储字符到Data的映射,Data则负责维护指向下一个Node的指针及标记当前节点是否为单词结尾的属性。文章还提供了Trie树的插入操作示例,展示了如何遍历字符串并逐字符地将数据插入Trie树中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Node

  • 每个Node用HashMap来实现, key是char, value是一个内部类Data
    • Data有两个成员, next指向下一个Node; isWord表示这个字母是不是单词的结尾
    • 内部类的成员和方法即使是private, 外部类也可访问
  • Node有put方法, 用来放入对应的字母, 如果这个字母已经在node里了, 就看看需不需要改isWord
  • Node有getNext方法, 根据字母返回下一个Node

如何插入?

  • 遍历字符串, 对于每一个字符, 往node里面put一次, 然后node往下走,
  • 如果遇到了结尾, 还要把isWord设为true

关于内部类的知识

  • 内部类访问外部类
    OuterClass.this.
    
  • 外部类访问内部类
    InnerClass ic = this.new InnerClass();
    // 然后就像普通成员变量一样
    
import java.util.*;

class Node{
    public HashMap<Character, Data> record = new HashMap<>();

    public Data returnData(){
        return this.new Data();
    }

    public class Data{
        public Node next;
        public boolean isWord;

        Data(Node n, boolean is){
            this.next = n;
            this.isWord = is;
        }

        public void setNext(Node n){
            this.next = n;
        }

        public void setIsWord(boolean is){
            this.isWord = is;
        }
    }

    public void put(char c, boolean isWord){
        if(this.record.containsKey(c)){
            if(isWord==true){
                Data tmp = this.record.get(c);
                tmp.setIsWord(true);
            }
        }else{
            Node new_node = new Node();
            Data tmp = new Data(new_node, isWord);
            this.record.put(c,tmp);
        }
    }

    public Node getNext(char c){
        Data tmp = this.record.get(c);
        return tmp.next;
    }
}


class Trie{
    Node root = new Node();

    public void add(String s){
        Node current = root;
        for(int i=0;i<s.length();++i){
            char c = s.charAt(i);

            boolean isWord = false;
            if(i==s.length()-1) isWord = true;

            current.put(c, isWord);
            current = current.getNext(c);
        }
    }
}


public class Main {

    public static void main(String[] args){
       Trie root = new Trie();
       root.add("ad");
       System.out.println(root.root.record.get('a').next.record.get('d').isWord);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值