为什么有单独的" trie_node"和"特里"结构?

时间:2014-09-18 03:56:09

标签: c++ c string tree trie

我已经阅读了以下实现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; 
};

我不明白为什么当我们只有一个带有指针数组和值类型的结构时,有两个结构。请帮忙。!

1 个答案:

答案 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的指针。前实现可能易于理解,实现和调试,而后面的实现更好地利用动态分配。实现可能有利于一个目的,但可能不适合其他目的。