【问题标题】:Why does each node in this Trie contain a linked list?为什么这个 Trie 中的每个节点都包含一个链表?
【发布时间】:2013-11-19 01:14:32
【问题描述】:

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

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

(1) 前导字符(可能为空(对于根)

(2) 字符串标签(可能为null(对于root))

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

(4) 节点 *RightSIbling

(5) 节点 *FirstChild

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

【问题讨论】:

  • 它应该是一个的链表吗?
  • 我相信链表应该包含它的孩子。但是它可能还需要包含它的正确兄弟,但我不能 100% 确定这一点
  • 检查cs.bu.edu/teaching/c/tree/trie 使用您提到的相同数据结构并且解释得很好

标签: data-structures trie


【解决方案1】:

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

单词:as、at 和

尝试:

   a
 / | \
s  t  n
      |
      d

使用你的结构:

根节点:

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

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

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]
}

节点[n]的第一个孩子:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2017-07-08
    • 1970-01-01
    相关资源
    最近更新 更多