对于我的班级项目,我必须构建一个Trie。我的教授坚持认为每个节点都包含一个链表,但我不明白为什么。为什么我不能只在根目录中放一个链表?不会在每个节点中放置链表是多余的吗?另外,我在每个节点的链表中放了多少个节点?
我的教授希望在我们的节点构造函数中看到以下字段:
(1)一个主角(可能是空的(对于root))
(2)String Label(可能为null(对于root))
(3)布尔值IsWord,指示当前节点是否表示整个单词(当一个单词可能是另一个单词的前缀时,这很有用。)
(4)Node * RightSIbling
(5)Node * FirstChild
另外,我很清楚还有其他可行的Trie实现不需要链表,但是我的教授坚持认为我们首先要学习这个特定的方法。
答案 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
}