为什么此Trie中的每个节点都包含一个链表?

时间:2013-11-19 01:14:33

标签: data-structures trie

对于我的班级项目,我必须构建一个Trie。我的教授坚持认为每个节点都包含一个链表,但我不明白为什么。为什么我不能只在根目录中放一个链表?不会在每个节点中放置链表是多余的吗?另外,我在每个节点的链表中放了多少个节点?

我的教授希望在我们的节点构造函数中看到以下字段:

(1)一个主角(可能是空的(对于root))

(2)String Label(可能为null(对于root))

(3)布尔值IsWord,指示当前节点是否表示整个单词(当一个单词可能是另一个单词的前缀时,这很有用。)

(4)Node * RightSIbling

(5)Node * FirstChild

另外,我很清楚还有其他可行的Trie实现不需要链表,但是我的教授坚持认为我们首先要学习这个特定的方法。

1 个答案:

答案 0 :(得分:1)

trie本质上是两个链表。一个(垂直)链接到它的最左边的孩子和一个(水平)链接到它的右边兄弟。兄弟列表的顺序是按字母顺序排列的,因此您可以搜索。

单词:as,at和

Trie树:

   a
 / | \
s  t  n
      |
      d

使用您的结构:

根节点:

Node {
char:           a
isWord:         false
rightSibling:   null
firstChild:     Node[s]
}

Root的第一个(最左边)孩子:

Node {
char:           s
isWord:         true
rightSibling:   Node[t]
firstChild:     null
}

Node [s]的正确兄弟

Node {
char:           t
isWord:         true
rightSibling:   Node[n]
firstChild:     null
}

Node [t]的正确兄弟

Node {
char:           n
isWord:         false
rightSibling:   Node[n]
firstChild:     Node[d]
}

Node [n]的第一个孩子:

Node {
char:           d
isWord:         true
rightSibling:   null
firstChild:     null
}