使用二叉树跟踪单词频率

时间:2012-04-08 21:15:28

标签: java binary-tree word-frequency

我目前正在学习二叉树和二叉搜索树,我正在研究的其中一个练习涉及读取文本文件,按字母顺序将每个单词存储在二叉树中,并使用不同的方法遍历树。 以下是具体规格:

  

阅读文本并构建一个二进制搜索树,其中包含文本中的所有单词(按字母顺序排列),存储单词并保留单词频率的计数(每个单词出现在文本中的次数)一个节点,并执行类中提到的树遍历。

我的问题是,当我将它添加到树中时,如何跟踪单词的频率?我们从来没有在课堂上覆盖相同的节点,所以我被困在这里。任何建议都表示赞赏!

5 个答案:

答案 0 :(得分:3)

简单。二叉树节点将包含两个元素,一个是字符串(比如键),另一个是整数计数(比如值)。在添加元素时检查它是否已存在,如果是,则只需递增计数,否则将该元素添加为计数为1的新二叉树节点。

答案 1 :(得分:2)

Tricky回答作业问题......

因此,您的节点显然会保留它所代表的单词。当您插入一个新单词时,您将创建该节点,但在此之前,您需要搜索该单词。如果您的树中已存在该单词的节点,只需检索该节点并在其中增加一个计数器。

public class MyNode
{
   String word;
   Integer counter;
}

得到它? :)

答案 2 :(得分:0)

  

当我将单词的频率添加到单词时,如何跟踪单词的频率   树

1)除了data的{​​{1}} leftright成员添加另一个成员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