这段代码中的错误是什么(BST)

时间:2016-04-30 19:24:32

标签: java binary-search-tree

这是一种在二叉搜索树中查找特定节点的方法...... 我不知道是什么问题,但由于某种原因,这段代码运行不正常......有什么帮助吗?

public KAUstudent findNodeName(String fName, String lName){
    return findNodeName(root, fName, lName);
}

public KAUstudent findNodeName(KAUstudent p , String fName, String lName){
    if (p == null)
    return null;
    else {
    // if the data we are searching for is found at p (at the current root)
        if (fName.equalsIgnoreCase(p.getFirstName()) && lName.equalsIgnoreCase(p.getLastName()) )
            return p;
        else if ((fName.compareToIgnoreCase(p.getFirstName())< 0) || (lName.compareToIgnoreCase(p.getLastName()) <0)) 
                return findNodeName(p.getLeft(), fName, lName);
        else
                return findNodeName(p.getRight(), fName, lName);
}
}

2 个答案:

答案 0 :(得分:0)

主要问题是你没有适当的&#34;部分订单&#34;为你的钥匙。关键的比较逻辑必须是这样的:

  when majorkey1.compareTo(majorkey2) < 0 :
      // less than
  when majorkey1.compareTo(majorkey2) == 0 AND
       minorkey1.compareTo(minorkey2) < 0 :
      // less than
  when majorkey1.compareTo(majorkey2) == 0 AND
       minorkey1.compareTo(minorkey2) == 0 :
      // equal to
  when majorkey1.compareTo(majorkey2) > 0 :
      // greater than

但这不是你的代码所实现的。

更新 - 更正的版本或多或少是正确的。 (最终的else是多余的。仔细阅读代码并考虑一下......你应该能够理解我为什么这么说。)

问题#2 :在构建树的代码中,您完全使用了错误的密钥。在搜索树时,以及在决定将新节点添加到树中的位置时,您需要使用相同的键/键对和相同的比较逻辑。

答案 1 :(得分:-1)

我猜这是问题

if (fName.equalsIgnoreCase(p.getFirstName()) && lName.equalsIgnoreCase(p.getLastName()) )
            return p;

如果两者都为真,则只返回p。尝试将&&更改为||。由于它是BST,因此正确的名字和姓氏可能不在树的同一级别上。 您可以将姓氏中的第一个组合成一个字符串并搜索它。如果你想知道如何做到这一点只是评论,我将解释代码。