我已经阅读了以下实现trie的实现。
typedef struct trie_node trie_node_t;
struct trie_node
{
int value;
trie_node_t *children[ALPHABET_SIZE];
};
// trie ADT
typedef struct trie trie_t;
struct trie
{
trie_node_t *root;
int count;
};
我不明白为什么当我们只有一个带有指针数组和值类型的结构时,有两个结构。请帮忙。!
答案 0 :(得分:4)
简短回答
trie_node_t
是每个节点的类型(链接到)trie。
trie_t
是每个特里的类型。
<强>用法强>
可能的用法可能是
trie_t tr1, tr2; /* Create 2 tries */
addstring(&tr1, "baseball"); /* This adds multiple nodes to existing trie */
addstring(&tr1, "basketball");
addstring(&tr2, "rock");
addstring(&tr2, "rocket");
addstring(&tr2, "rob");
作者使用2结构可能是因为它使事物更加模块化和易于管理,并且易于动态分配。
<强>可视化强>
+--------+
| tr2 | trie_t
+---+----+
|
+-+-+
| r | trie_node_t
+-+-+
|
+-+-+
| o | trie_node_t
+-+-+
/ \
/ \
+-+-+ +-+-+
| b*| | c | both trie_node_t
+---+ +-+-+
|
+-+-+
| k*| trie_node_t
+-+-+
|
+-+-+
| e | trie_node_t
+-+-+
|
+-+-+
| t*| trie_node_t
+---+
(* means count is not zero)
<强>最后强>
Trie(或其他数据结构,例如链表)只是一个想法,实现可能会有所不同。
例如,链表可以实现为数组(将下一项的索引保持为链接并保留最后一个特殊数字)或作为节点类型和列表类型,其中列表类型包含指向head的指针。前实现可能易于理解,实现和调试,而后面的实现更好地利用动态分配。实现可能有利于一个目的,但可能不适合其他目的。