前缀树trie树

力扣  208  实现前缀树

 1.前缀树的每个结点有26个子节点,分别装a,b,c,d,e,f........

具体实现的时候是1个结点里面有一个长度为26个字母的数组,kids[0]==null表示子节点中不含有‘a’这个字符

2.search方法和startwith方法的区别:

先往前缀树中插入单词apple

然后search("apple")   返回的是true  也就是说apple是曾经插入的单词

但是如果:

search("app"),返回的就是false

startwith("app")  返回的就是true

也就是说search方法判断的是是否曾经插入过的一个单词,也就是说这个词的最后一个字符是叶子节点

startwith是不用是曾经插入过的单词,只要包含就可以,这个词最后一个字符不用是叶子节点,最后一个字符可以是非叶子结点

class Trie 
{
   class Node
   {
      Node[]   kids=new  Node[26];
      boolean  flag;//标志从根节点到这个结点是不是曾经插入过的一个单词

   }

    Node root=new  Node();

    public Trie() 
    {

    }
    
    //往前缀树中插入字符
    public void insert(String word) 
    {
        int n=word.length();
        Node  cur=root;//从前缀树的根节点出发
        for(int i=0;i<word.length();i++)
        {
            char temp=word.charAt(i);
            int index=temp-'a';
            if(cur.kids[index]==null)
            {
                cur.kids[index]=new Node();
            }
            cur=cur.kids[index];
        }
        cur.flag=true;
    }
    
    //检查前缀树中是否包含某个单词(是否曾经插入过这个单词)
    public boolean search(String word) 
    {

        Node  cur=root;//从前缀树的根节点出发
        for(int i=0;i<word.length();i++)
        {
            char temp=word.charAt(i);
            int index=temp-'a';
            if(cur.kids[index]==null)
            {
                return false;
            }
            cur=cur.kids[index];
        }
        return cur.flag;
    }
    
    public boolean startsWith(String prefix) 
    {

        Node  cur=root;//从前缀树的根节点出发
        for(int i=0;i<prefix.length();i++)
        {
            char temp=prefix.charAt(i);
            int index=temp-'a';
            if(cur.kids[index]==null)
            {
                 return false;
            }
            cur=cur.kids[index];
        }
        return true;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值