# [LeetCode]Implement Trie(Prefix Tree)，解题报告

65 篇文章 1 订阅

## 概述

Trie树，又称为字典树、单词查找树或者前缀树，是一种用于快速检索的多叉数结构。例如，英文字母的字典树是26叉数，数字的字典树是10叉树。
Trie树的基本性质有三点，归纳为：

1. 根节点不包含字符，根节点外每一个节点都只包含一个字符。
2. 从根节点到某一节点，路径上经过的字符连接起来，为该节点对应的字符串。
3. 每个节点的所有子节点包含的字符串不相同。

## Trie树基本实现

### 定义Trie树节点

class TrieNode {
boolean isWord;
HashMap<Character, TrieNode> nexts;

public TrieNode() {
nexts = new HashMap<Character, TrieNode>();
}
}

### 添加操作

    // Inserts a word into the trie.
public void insert(String word) {
char[] s = word.toCharArray();

TrieNode p = root;
int i = 0, n = s.length;

// traverse existing
while (i < n) {
TrieNode next = p.nexts.get(s[i]);
if (next != null) {
p = next;
i ++;
} else {
break;
}
}

// append new nodes
while (i < n) {
TrieNode newTrie = new TrieNode();
p.nexts.put(s[i], newTrie);
p = newTrie;
i ++;
}

// set word end
p.isWord = true;
}

### 查询word是否在Trie树中

    // Returns if the word is in the trie.
public boolean search(String word) {
TrieNode p = root;

for (int i = 0; i < word.length(); i ++) {
TrieNode child = p.nexts.get(word.charAt(i));
if (child == null) {
return false;
}
p = child;
}

return p.isWord;
}

// Returns if there is any word in the trie
// that starts with the given prefix.
public boolean startsWith(String prefix) {
TrieNode p = root;

for (int i = 0; i < prefix.length(); i ++) {
TrieNode child = p.nexts.get(prefix.charAt(i));
if (child == null) {
return false;
}
p = child;
}

return true;
}

## AC完整代码

import java.util.HashMap;

class TrieNode {
boolean isWord;
HashMap<Character, TrieNode> nexts;

public TrieNode() {
nexts = new HashMap<Character, TrieNode>();
}
}

public class Trie {
private TrieNode root;

public Trie() {
root = new TrieNode();
}

// Inserts a word into the trie.
public void insert(String word) {
char[] s = word.toCharArray();

TrieNode p = root;
int i = 0, n = s.length;

// traverse existing
while (i < n) {
TrieNode next = p.nexts.get(s[i]);
if (next != null) {
p = next;
i ++;
} else {
break;
}
}

// append new nodes
while (i < n) {
TrieNode newTrie = new TrieNode();
p.nexts.put(s[i], newTrie);
p = newTrie;
i ++;
}

// set word end
p.isWord = true;
}

// Returns if the word is in the trie.
public boolean search(String word) {
TrieNode p = root;

for (int i = 0; i < word.length(); i ++) {
TrieNode child = p.nexts.get(word.charAt(i));
if (child == null) {
return false;
}
p = child;
}

return p.isWord;
}

// Returns if there is any word in the trie
// that starts with the given prefix.
public boolean startsWith(String prefix) {
TrieNode p = root;

for (int i = 0; i < prefix.length(); i ++) {
TrieNode child = p.nexts.get(prefix.charAt(i));
if (child == null) {
return false;
}
p = child;
}

return true;
}

public static void main(String[] args) {
Trie trie = new Trie();
trie.insert("keydsdsds");
System.out.println(trie.startsWith("key"));
}
}
• 0
点赞
• 1
收藏
觉得还不错? 一键收藏
• 1
评论
03-01 2923
07-11 772
05-09 4904
05-09 515
12-04 100
02-26 349

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