数据结构-非线性结构-树形结构:Trie/字典树/前缀树【专门用于处理字符串类数据】

本文主要是介绍数据结构-非线性结构-树形结构:Trie/字典树/前缀树【专门用于处理字符串类数据】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

Trie的代码实现

import java.util.TreeMap;/*** Trie树(前缀树、字典树)** @author whx* @version 2018/9/1*/
public class Trie {/*** 节点类** @author whx* @version 2018/9/1*/private class Node{public boolean isWord;public TreeMap<Character,Node> next;public Node(boolean isWord) {this.isWord = isWord;next = new TreeMap<>();}public Node() {this(false);}}private Node root;private int size;public Trie() {root = new Node();size = 0;}public int getSize(){return size;}/*** 添加一个单词** @param word* @return void* @author whx* @version 2018/9/1*/public void add(String word){Node cur = root;for (int i = 0; i < word.length(); i++) {char c = word.charAt(i);if(cur.next.get(c) == null){cur.next.put(c,new Node());}cur = cur.next.get(c);}if(!cur.isWord){cur.isWord = true;size ++;}}/*** 递归添加一个单词** @param word* @return void* @author whx* @version 2018/9/1*/public void addRecursion(String word){root = addRecursion(root,word);}/*** 在node节点添加一个单词** @param node* @param word* @return Trie.Node* @author whx* @version 2018/9/1*/private Node addRecursion(Node node, String word){if(node == null){return null;}if(word.length() > 0){if(node.next.get(word.charAt(0)) == null) {node.next.put(word.charAt(0), new Node());}node.next.put(word.charAt(0),addRecursion(node.next.get(word.charAt(0)), word.substring(1)));if(word.length() == 1 && !node.next.get(word.charAt(0)).isWord){node.next.get(word.charAt(0)).isWord = true;size ++;}}return node;}/*** 是否包含某个单词** @param word* @return boolean* @author whx* @version 2018/9/1*/public boolean contains(String word){Node cur = root;for (int i = 0; i < word.length(); i++) {char c = word.charAt(i);if(cur.next.get(c) == null){return false;}cur = cur.next.get(c);}return cur.isWord;}/*** 递归查询是否包含某个单词** @param word* @return boolean* @author whx* @version 2018/9/1*/public boolean containsRecurison(String word){return containsRecurison(root,word);}/*** 递归查询某个节点中是否包含某个单词** @param node* @param word* @return boolean* @author whx* @version 2018/9/1*/private boolean containsRecurison(Node node, String word) {if(node == null){return false;}if(word.length() > 0){if(node.next.get(word.charAt(0)) == null) {return false;}else if (word.length() == 1 && node.next.get(word.charAt(0)).isWord){return true;}return containsRecurison(node.next.get(word.charAt(0)), word.substring(1));}return false;}/*** 是否包含此前缀的单词** @param prefix* @return boolean* @author whx* @version 2018/9/1*/private boolean isPrefix(String prefix){Node cur = root;for (int i = 0; i < prefix.length(); i++) {char c = prefix.charAt(i);if(cur.next.get(c) == null){return false;}cur = cur.next.get(c);}return true;}/*** 递归查询是否包含此前缀的单词** @param word* @return boolean* @author whx* @version 2018/9/1*/public boolean isPrefixRecurison(String word){return isPrefixRecurison(root,word);}/*** 递归查询是否包含此前缀的单词** @param node* @param word* @return boolean* @author whx* @version 2018/9/1*/private boolean isPrefixRecurison(Node node, String word) {if(node == null){return false;}if(word.length() > 0){if(node.next.get(word.charAt(0)) == null) {return false;}else if (word.length() == 1){return true;}return isPrefixRecurison(node.next.get(word.charAt(0)), word.substring(1));}return false;}}

Main.java

/*** @author whx* @version 2018/9/1*/
public class Main {public static void main(String[] args) {Trie trie = new Trie();trie.add("word");boolean isContains = trie.contains("word");System.out.println(isContains);}
}

这篇关于数据结构-非线性结构-树形结构:Trie/字典树/前缀树【专门用于处理字符串类数据】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128843

相关文章

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

Python实现将实体类列表数据导出到Excel文件

《Python实现将实体类列表数据导出到Excel文件》在数据处理和报告生成中,将实体类的列表数据导出到Excel文件是一项常见任务,Python提供了多种库来实现这一目标,下面就来跟随小编一起学习一... 目录一、环境准备二、定义实体类三、创建实体类列表四、将实体类列表转换为DataFrame五、导出Da

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

Python实现数据清洗的18种方法

《Python实现数据清洗的18种方法》本文主要介绍了Python实现数据清洗的18种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录1. 去除字符串两边空格2. 转换数据类型3. 大小写转换4. 移除列表中的重复元素5. 快速统

Python结合requests和Cheerio处理网页内容的操作步骤

《Python结合requests和Cheerio处理网页内容的操作步骤》Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HT... 目录一、前言二、环境搭建三、requests库的基本使用四、Cheerio库的基本使用五、结合req

Python数据处理之导入导出Excel数据方式

《Python数据处理之导入导出Excel数据方式》Python是Excel数据处理的绝佳工具,通过Pandas和Openpyxl等库可以实现数据的导入、导出和自动化处理,从基础的数据读取和清洗到复杂... 目录python导入导出Excel数据开启数据之旅:为什么Python是Excel数据处理的最佳拍档

使用Python处理CSV和Excel文件的操作方法

《使用Python处理CSV和Excel文件的操作方法》在数据分析、自动化和日常开发中,CSV和Excel文件是非常常见的数据存储格式,ython提供了强大的工具来读取、编辑和保存这两种文件,满足从基... 目录1. CSV 文件概述和处理方法1.1 CSV 文件格式的基本介绍1.2 使用 python 内

在Pandas中进行数据重命名的方法示例

《在Pandas中进行数据重命名的方法示例》Pandas作为Python中最流行的数据处理库,提供了强大的数据操作功能,其中数据重命名是常见且基础的操作之一,本文将通过简洁明了的讲解和丰富的代码示例,... 目录一、引言二、Pandas rename方法简介三、列名重命名3.1 使用字典进行列名重命名3.编

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接