十三、字典树
访问 www.coding-time.cn 阅读原文动画效果,体验更佳。
在计算机科学中, 字典树(trie,中文又被称为”单词查找树“或 ”键树“), 也称为数字树,有时候也被称为基数树或前缀树(因为它们可以通过前缀搜索),它是一种搜索树--一种已排序的数据结构,通常用于存储动态集或键为字符串的关联数组。
与二叉搜索树不同, 树上没有节点存储与该节点关联的键; 相反,节点在树上的位置定义了与之关联的键。一个节点的全部后代节点都有一个与该节点关联的通用的字符串前缀, 与根节点关联的是空字符串。
值对于字典树中关联的节点来说,不是必需的,相反,值往往和相关的叶子相关,以及与一些键相关的内部节点相关。
有关字典树的空间优化示意,请参阅紧凑前缀树。
Trie
1. TrieNode
import HashTable from '../hash-table/HashTable'; export default class TrieNode { /** * @param {string} character * @param {boolean} isCompleteWord */ constructor(character, isCompleteWord = false) { this.character = character; this.isCompleteWord = isCompleteWord; this.children = new HashTable(); } /** * @param {string} character * @return {TrieNode} */ getChild(character) { return this.children.get(character); } /** * @param {string} character * @param {boolean} isCompleteWord * @return {TrieNode} */ addChild(character, isCompleteWord = false) { if (!this.children.has(character)) { this.children.set(character, new TrieNode(character, isCompleteWord)); } const childNode = this.children.get(character); // In cases similar to adding "car" after "carpet" we need to mark "r" character as complete. childNode.isCompleteWord = childNode.isCompleteWord || isCompleteWord; return childNode; } /** * @param {string} character * @return {TrieNode} */ removeChild(character) { const childNode = this.getChild(character); // Delete childNode only if: // - childNode has NO children, // - childNode.isCompleteWord === false. if ( childNode && !childNode.isCompleteWord && !childNode.hasChildren() ) { this.children.delete(character); } return this; } /** * @param {string} character * @return {boolean} */ hasChild(character) { return this.children.has(character); } /** * Check whether current TrieNode has children or not. * @return {boolean} */ hasChildren() { return this.children.getKeys().length !== 0; } /** * @return {string[]} */ suggestChildren() { return [...this.children.getKeys()]; } /** * @return {string} */ toString() { let childrenAsString = this.suggestChildren().toString(); childrenAsString = childrenAsString ? `:${childrenAsString}` : ''; const isCompleteString = this.isCompleteWord ? '*' : ''; return `${this.character}${isCompleteString}${childrenAsString}`; }}
带你读《图解算法小抄》十三、字典树(2)https://developer.aliyun.com/article/1348163?groupCode=tech_library