Perl 语言 实现前缀树 (Trie) 数据结构

Perl阿木 发布于 2025-06-30 10 次阅读


摘要:前缀树(Trie)是一种用于检索字符串数据集中的键的有序树数据结构。本文将使用 Perl 语言实现前缀树数据结构,并对其基本操作进行详细解析。

一、

前缀树是一种广泛应用于字符串检索的数据结构,具有查找效率高、空间利用率好的特点。在搜索引擎、文本编辑器、自动补全等场景中,前缀树都发挥着重要作用。本文将使用 Perl 语言实现前缀树数据结构,并对其基本操作进行详细解析。

二、前缀树的基本概念

1. 节点:前缀树的每个节点包含一个字符、一个指向子节点的指针数组以及一个标记,表示该节点是否为字符串的结尾。

2. 根节点:前缀树的根节点不包含任何字符,仅作为树的起始点。

3. 路径:从根节点到某个节点的路径上的字符序列称为该节点的前缀。

4. 前缀树的特点:

(1)每个节点包含一个字符;

(2)每个节点包含一个指向子节点的指针数组;

(3)每个节点的指针数组长度等于字符集的大小;

(4)每个节点的指针数组中的指针按照字符的顺序排列;

(5)每个节点的标记表示该节点是否为字符串的结尾。

三、Perl 语言实现前缀树

1. 定义节点类

perl

package TrieNode;

sub new {


my ($class, $char) = @_;


my $self = {


char => $char,


children => [],


is_end_of_word => 0


};


bless $self, $class;


return $self;


}


2. 定义前缀树类

perl

package Trie;

sub new {


my ($class) = @_;


my $self = {


root => TrieNode->new('')


};


bless $self, $class;


return $self;


}

插入字符串


sub insert {


my ($self, $word) = @_;


my $node = $self->{root};


foreach my $char (split //, $word) {


my $found = 0;


foreach my $child (@{$node->{children}}) {


if ($child->{char} eq $char) {


$node = $child;


$found = 1;


last;


}


}


unless ($found) {


my $new_node = TrieNode->new($char);


push @{$node->{children}}, $new_node;


$node = $new_node;


}


}


$node->{is_end_of_word} = 1;


}

查找字符串


sub search {


my ($self, $word) = @_;


my $node = $self->{root};


foreach my $char (split //, $word) {


my $found = 0;


foreach my $child (@{$node->{children}}) {


if ($child->{char} eq $char) {


$node = $child;


$found = 1;


last;


}


}


unless ($found) {


return 0;


}


}


return $node->{is_end_of_word};


}

删除字符串


sub delete {


my ($self, $word) = @_;


my $node = $self->{root};


my @path = ($node);


foreach my $char (split //, $word) {


my $found = 0;


foreach my $child (@{$node->{children}}) {


if ($child->{char} eq $char) {


$node = $child;


$found = 1;


last;


}


}


unless ($found) {


return 0;


}


push @path, $node;


}


$node->{is_end_of_word} = 0;


return 1 if $node eq $self->{root} && !$node->{is_end_of_word};


my $last_node = pop @path;


my $last_child = $last_node->{children}[-1];


if ($last_child && $last_child eq $node) {


pop @{$last_node->{children}};


}


else {


foreach my $child (@{$last_node->{children}}) {


if ($child eq $node) {


$last_node->{children}[-1]->{children} = [@$last_node->{children}];


last;


}


}


}


return 1;


}


3. 测试代码

perl

use Trie;

my $trie = Trie->new();


$trie->insert('apple');


$trie->insert('banana');


$trie->insert('orange');

print $trie->search('apple') ? 'Found' : 'Not Found', ""; 输出:Found


print $trie->search('app') ? 'Found' : 'Not Found', ""; 输出:Not Found


print $trie->delete('apple') ? 'Deleted' : 'Not Deleted', ""; 输出:Deleted


print $trie->search('apple') ? 'Found' : 'Not Found', ""; 输出:Not Found


四、总结

本文使用 Perl 语言实现了前缀树数据结构,并对其基本操作进行了详细解析。前缀树在字符串检索场景中具有广泛的应用,掌握其实现方法对于提高编程能力具有重要意义。