当前位置:首页 > JavaScript

js实现trie

2026-02-02 00:15:58JavaScript

实现 Trie 数据结构

Trie(前缀树)是一种树形数据结构,用于高效存储和检索字符串集合。以下是 JavaScript 实现 Trie 的完整代码和详细说明。

Trie 节点结构

每个 Trie 节点包含一个子节点映射和一个标志表示是否为单词结尾:

class TrieNode {
  constructor() {
    this.children = {}; // 子节点映射
    this.isEndOfWord = false; // 标记是否为单词结尾
  }
}

Trie 类实现

class Trie {
  constructor() {
    this.root = new TrieNode(); // 初始化根节点
  }

  // 插入单词
  insert(word) {
    let node = this.root;
    for (const char of word) {
      if (!node.children[char]) {
        node.children[char] = new TrieNode();
      }
      node = node.children[char];
    }
    node.isEndOfWord = true;
  }

  // 搜索完整单词
  search(word) {
    let node = this.root;
    for (const char of word) {
      if (!node.children[char]) {
        return false;
      }
      node = node.children[char];
    }
    return node.isEndOfWord;
  }

  // 检查前缀是否存在
  startsWith(prefix) {
    let node = this.root;
    for (const char of prefix) {
      if (!node.children[char]) {
        return false;
      }
      node = node.children[char];
    }
    return true;
  }
}

使用示例

const trie = new Trie();
trie.insert("apple");
console.log(trie.search("apple"));   // true
console.log(trie.search("app"));     // false
console.log(trie.startsWith("app")); // true
trie.insert("app");
console.log(trie.search("app"));     // true

方法说明

insert(word)

  • 时间复杂度:O(m),m 为单词长度
  • 从根节点开始遍历每个字符
  • 为不存在的字符创建新节点
  • 最后标记单词结束

search(word)

  • 时间复杂度:O(m)
  • 遍历每个字符检查是否存在对应节点
  • 必须匹配完整单词(isEndOfWord为true)

startsWith(prefix)

  • 时间复杂度:O(m)
  • 只需检查前缀路径是否存在
  • 不要求是完整单词

扩展功能

实现删除操作需要处理节点清理:

delete(word) {
  const deleteHelper = (node, word, index) => {
    if (index === word.length) {
      if (!node.isEndOfWord) return false;
      node.isEndOfWord = false;
      return Object.keys(node.children).length === 0;
    }
    const char = word[index];
    if (!node.children[char]) return false;
    const shouldDelete = deleteHelper(node.children[char], word, index + 1);
    if (shouldDelete) {
      delete node.children[char];
      return Object.keys(node.children).length === 0;
    }
    return false;
  };
  deleteHelper(this.root, word, 0);
}

应用场景

  • 自动补全系统
  • 拼写检查
  • IP路由最长前缀匹配
  • 字典实现

这种实现方式空间效率较高,适合处理大量具有公共前缀的字符串集合。可以根据具体需求扩展功能,如添加词频统计或支持模糊查询。

js实现trie

标签: jstrie
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swip…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的H…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…