我目前正在学习二叉树和二叉搜索树,我正在研究的其中一个练习涉及读取文本文件,按字母顺序将每个单词存储在二叉树中,并使用不同的方法遍历树。 以下是具体规格:
阅读文本并构建一个二进制搜索树,其中包含文本中的所有单词(按字母顺序排列),存储单词并保留单词频率的计数(每个单词出现在文本中的次数)一个节点,并执行类中提到的树遍历。
我的问题是,当我将它添加到树中时,如何跟踪单词的频率?我们从来没有在课堂上覆盖相同的节点,所以我被困在这里。任何建议都表示赞赏!
答案 0 :(得分:3)
简单。二叉树节点将包含两个元素,一个是字符串(比如键),另一个是整数计数(比如值)。在添加元素时检查它是否已存在,如果是,则只需递增计数,否则将该元素添加为计数为1的新二叉树节点。
答案 1 :(得分:2)
Tricky回答作业问题......
因此,您的节点显然会保留它所代表的单词。当您插入一个新单词时,您将创建该节点,但在此之前,您需要搜索该单词。如果您的树中已存在该单词的节点,只需检索该节点并在其中增加一个计数器。
public class MyNode
{
String word;
Integer counter;
}
得到它? :)
答案 2 :(得分:0)
当我将单词的频率添加到单词时,如何跟踪单词的频率 树
1)除了data
的{{1}} left
和right
成员添加另一个成员TreeNode
并且每次尝试添加一个成员{1}时增加1树中现有的单词。
2)您可以使用单独的哈希表来保持单词和出现的映射。如果哈希表中存在该单词,则只增加计数。如果它不存在,请将其添加到树中。由于哈希表
,这需要额外的空间答案 3 :(得分:0)
使用HashMap,用String,Integer填充它。迭代文本中的单词,如果尚未添加,则将其放在带有整数(出现)== 1的地图中。如果之前添加,则用1增加整数。
处理完所有文本后,您可以使用带有String和Integer的对象填充列表,并根据compareTo方法对它们进行排序。
答案 4 :(得分:0)
万一有需要的人。
scala BST容器的实现。
trait BSTree[+A]
case object Empty extends BSTree[Nothing]
case class Node[+A](left: BSTree[A], x: A, right: BSTree[A]) extends BSTree[A]
object BSTree {
def insert[T](t: BSTree[T], k: T)(
implicit ord: T => Ordered[T]
): BSTree[T] = t match {
case Empty => Node(Empty, k, Empty)
case Node(l, x, r) if k < x => Node(insert(l, k), x, r)
case Node(l, x, r) if k == x => Node(l, k, r)
case Node(l, x, r) => Node(l, x, insert(r, k))
}
def toList[T](t: BSTree[T]): List[T] = t match {
case Empty => Nil
// preorder traverse
case Node(l, x, r) => x :: toList(l) ++ toList(r)
}
def apply[T](as: T*)(implicit ord: T => Ordered[T]): BSTree[T] = as.foldLeft(
Empty: BSTree[T])((t, e) => insert(t, e))
}
object Main extends App {
case class WordCount(c: Char, var count: Int) {
override def toString: String = s"'$c' -> $count"
}
implicit def wordCountConvert(x: WordCount): Ordered[WordCount] =
(that: WordCount) => if (x.c.<(that.c)) -1
else if (x.c == that.c) {
that.count = x.count + 1
0
} else 1
val content = "Scala Cool!"
val wordCountTree = BSTree(content.filter(_.isLetter).map(WordCount(_, 1)): _*)
println(BSTree.toList(wordCountTree))
}
并在此处输出
List('S' -> 1, 'C' -> 1, 'c' -> 1, 'a' -> 2, 'a' -> 1, 'l' -> 2, 'o' -> 2, 'l' -> 1, 'o' -> 1)
请参见示例here