Trie树学习笔记

Trie树:字典树,单词查找树

特点:

  1. 根节点不包含元素;
  2. 将根到当前节点路径上的字符连接起来,即为该节点对应的字符串;
  3. 每个节点的子节点对应的字符串各不相同;
  4. 对n个字符串构建字典树,时间复杂度为O(n*len),len表示字符串的平均长度;
  5. 对字典树查找的时间复杂度为O(len),len为待查找字符串的长度;
  6. 以空间换时间。

应用:

  1. 在n个字符串中,判断是否存在某个字符串是另一个字符串的前缀;
  2. 对n个正整数,求出异或值最大的两个数。
import java.util.Scanner;

class TrieNode{

    TrieNode[] next = new TrieNode[26]; //假设字典树中只存在英文小写字母
    boolean flag = false;   //标志从根到当前节点的字符连接起来是否构成一个合乎条件的单词

}


public class Trie {

    TrieNode root = new TrieNode(); //字典树根节点(哨兵)

    public boolean searchTrie(String str) { //搜索字符串是否出现在字典树中

        if (str == null || str.length() == 0 || root == null)
            return false;

        int i = 0;
        TrieNode p = root;
        while (i < str.length()) {
            char temp = str.charAt(i);
            TrieNode t = p.next[temp - 'a'];
            if (t == null)
                return false;
            p = t;
            i++;
        }

        if (p.flag == true)
            return true;
        return false;
    }

    public void insertTrie(String str) {    //将字符串插入字典树
        insertTrie2(str, 0, root);
    }

    public void insertTrie2(String str, int i, TrieNode root) { 
        if (str == null || str.length() == 0)
            return;
        if (i >= str.length()) {
            root.flag = true;
            return;
        }
        char temp = str.charAt(i);
        if (root.next[temp - 'a'] != null) {
            if (i >= str.length())
                root.flag = true;
            return;
        }
        TrieNode t = new TrieNode();
        root.next[temp - 'a'] = t;
        insertTrie2(str, i + 1, t);
    }

    public static void main(String[] args) {

        Trie trie = new Trie();
        String[] strs = new String[5];
        strs[0] = "hello";
        strs[1] = "world";
        strs[2] = "dengzy";
        strs[3] = "jlu";
        strs[4] = "nicetomeetyou";

        for (int i = 0; i < 5; i++)
            trie.insertTrie(strs[i]);

        Scanner in = new Scanner(System.in);
        while (true) {
            String str = in.next();
            System.out.println(trie.searchTrie(str));
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值