使用二叉树查找字谜

时间:2010-09-15 11:58:26

标签: java binary-tree

我目前正在尝试创建一个使用二叉树的方法,该树可以找到用户输入的单词的字谜。

如果树不包含该单词的任何其他字谜(即,如果该键不在树中或相关链表中的唯一元素是用户提供的单词),则显示消息“no anagram found “打印出来 例如,如果树中出现关键字“opst”,其中包含“spot”,“pots”和“tops”字样的相关链接列表,并且用户给出了“spot”字样,则程序应打印“pots”和“上衣”(但不是现场)。

public boolean find(K thisKey, T thisElement){
    return find(root, thisKey, thisElement);
}

public boolean find(Node current, K thisKey, T thisElement){
    if (current == null)
        return false;
    else{
        int comp = current.key.compareTo(thisKey);
        if (comp>0)
            return find(current.left, thisKey, thisElement);
        else if(comp<0)
            return find(current.right, thisKey, thisElement);
        else{
            return current.item.find(thisElement);
        }
    }
}

虽然我创建了这个方法来查找提供的元素是否在树中(以及相关的键),但我被告知不要重复使用此代码来查找字谜。

K是扩展Comparable并表示Key的泛型类型,T是表示列表中项目的泛型类型。

如果我需要额外的方法,我可以编辑这篇文章,但我绝对迷失了。 (只需要一个正确方向的指针)

2 个答案:

答案 0 :(得分:1)

有点不清楚究竟是什么绊倒你(除了“我写了一个不错的发现方法但我不允许使用它。”),所以我认为最好的办法是从顶部开始。< / p>

我想您会发现,一旦您以正确的方式获得数据结构,实际的算法将相对容易地遵循(许多计算机科学问题都有这个功能。)

你有三件事:

1)许多链表,每个链表都包含一组字母的字谜。我假设您可以根据需要生成这些列表。

2)二叉树,它将字符串(键)映射到从这些字符串生成的字谜列表。同样,我假设您能够对这些树木执行基本操作 - 添加元素,按键查找元素等。

3)用户输入的字符串。

洞察力:一组字母的字谜形成等值类。这意味着anagram列表的任何成员都可以用作与列表关联的键。此外,这意味着您不需要在树中存储指向同一列表的多个键(假设我们对构建数据有点聪明;请参阅下文)。

具体而言,没有必要同时将“spot”和“opts”作为指向同一列表的树中的键,因为一旦你可以使用任何“spot”的字谜找到列表,你就会得到< em> all “spot”的字谜。

巧妙地构建数据:根据我们的见解,假设我们的树只包含每个独特字谜集的一个键。所以“opts”映射到{“opts”,“pots”,“spot”等。}。如果我们的用户给了我们一个我们没有用作其字谜集的键的字符串,会发生什么?我们如何判断如果用户键入“spot”,我们应该找到由“opts”键入的列表?

答案是规范化存储在我们数据结构中的数据。这是一种计算机科学的方式,表示我们对如何存储数据实施任意规则。 (规范化数据是一种在许多不同计算机科学领域中反复出现的有用技术。)第一条规则是我们的树中只有一个键映射到给定的链表。其次,如果我们确保我们实际存储的每个密钥都是可预测的 - 那就是我们知道即使用户输入“spot”我们也应该搜索“opts”?

有很多方法可以实现这种可预测性 - 一个简单的方法是确保每个键的字母按字母顺序排列。然后,我们知道每组字谜将由字母顺序排在第一位的(唯一!)成员键入。始终如一地执行此规则可以轻松搜索树 - 我们知道无论用户提供什么字符串,我们想要的关键字是用字母顺序输入用户输入的字符串。

把它放在一起:我将在这里提供高级算法,使其更加具体。

1)从用户那里获取一个String(保持这个String,我们稍后会需要它)

2)将此字符串转换为遵循我们的规范化方案的搜索关键字    (您可以在“K”类的构造函数中执行此操作,这可确保您的程序中的任何位置都不会有非规范化的键。)

3)在树中搜索该密钥,并获取与其关联的链接列表。此列表包含用户输入字符串的每个字谜。

4)打印列表中不是用户原始字符串的所有项目(请参阅为什么我们保持字符串方便?)


<强>外卖

通常,您的数据会有一些特殊功能,让您变得聪明。在这种情况下,anagram列表的任何成员都可以成为我们为该列表存储的唯一键。

规范化数据可为您提供可预测性,并让您有效地对其进行推理。如果每个键可以是其anagram列表中的任意成员,那么“查找”算法会有多难?

推论:使您的数据结构完全正确(我存储的是什么?如何连接这些部分?它是如何表示的?)将使编写算法变得更加容易。

答案 1 :(得分:0)

如何对单词中的字符进行排序,然后进行比较。