N刷前缀树,思考与感悟

本文分析了前缀树的实现,指出其结构中节点的next指针用于存储字符映射而非实际字符,强调了字符下标在前缀树中的作用。作者还讨论了与二叉树的对比,以及在插入、搜索和判断是否以某前缀开头的操作实现。
摘要由CSDN通过智能技术生成

写在前面

        前缀树这道题目208. 实现 Trie (前缀树) - 力扣(LeetCode)自己刷过好几遍,每一次都感觉差点意思,今天又再次刷到这道题目,将自己多次刷过之后的一点思考与感悟写如下:

        关于前缀树具体如何实现请参考如下链接,在此只阐述自己的思考。【数据结构与算法系列】——前缀树(字典树)、后缀树,主要用于海量数据的查找和去重问题_域名匹配 前缀树 后缀树-CSDN博客

  实现前缀树需要定义一个前缀树的类: 

class TrieNode{
    boolean end;    // 定义每一个节点的结束标志,如果其为true表示某个单词完全在树中终止
    TrieNode next = new TrieNode[26]    // 存放单词中的具体的字母
}
  •         今天刷这道题目让我联想到二叉树数据结构中每一个节点都有一个val用于存储当前节点对应的值,想到这里之后思考为什么前缀树数据结构中每个节点不设置一个具体的属性如:char val用于存储当前节点的属性值?
  •         前缀树结构中的next指针属性已经定义了当前前缀树中可以存储的具体的字母值,也就是new TrieNode[26],表示每个TrieNode节点可以存储26个字母,这里的存储26个字母并不是真正将26个字母存储到对应的位置,而是使用字母和下标的映射关系来表示存储,'a'对应下标0,同时next['a' - '0']需要存储下一级的TrieNode节点,用于实现向下延深的功能。
  •         cur.next[ch - '0'] = new TrieNode()。如果使用next[ch - '0']存储具体属性值则不能实现树的功能。
  •         进一步思考二叉树中left和right指向下一级二叉树,在前缀树中变为了一个字符对应的下标指向下一级的26个字符。
  • 前缀树数据结构中并不存储实际对应的字符值,而是通过数组下标和实际字符值建立映射关系。

 

代码实现

class Trie {
    public class TrieNode{
        boolean end;
        TrieNode[] next = new TrieNode[26];
    }
    public TrieNode root;
    public Trie() {
        root = new TrieNode();
    }
    
    public void insert(String word) {
        TrieNode cur = root;
        for(int i = 0; i < word.length(); i++){
            char ch = word.charAt(i);
            if(cur.next[ch - 'a'] == null){
                cur.next[ch - 'a']  = new TrieNode();
            }
            cur = cur.next[ch - 'a'];
        }
        cur.end = true;
    }
    
    public boolean search(String word) {
        TrieNode cur = root;
        for(int i = 0; i < word.length(); i++){
            char ch = word.charAt(i);
            if(cur.next[ch - 'a']   == null)    return false;
            cur = cur.next[ch - 'a'];
        }
        return cur.end;
    }
    
    public boolean startsWith(String prefix) {
        TrieNode cur = root;
        for(int i = 0; i < prefix.length(); i++){
            char ch = prefix.charAt(i);
            if(cur.next[ch - 'a'] == null)  return false;
            cur = cur.next[ch - 'a'];
        }
        return true;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值