2016-04-30 85 views
0

这是一种方法来查找特定的节点在二叉搜索树...... 我不知道有什么问题吗,但由于某种原因这个代码不正常..任何帮助?什么是错误的代码(BST)

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); 
} 
} 
+0

请解释这意味着什么不正常。它在做什么与你期望的? – ChiefTwoPencils

+0

如果名称存在于树中,它应该返回节点。否则它应该返回null。但有时它会返回null,即使名称exsit – Chie

回答

-1

我猜这就是问题所在

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

它只返回p如果两个都是如此。尝试将&&更改为||。由于它是BST,所以正确的名字和姓氏可能不在树的同一层。 您可以将姓氏中的第一个合并到单个字符串中并进行搜索。如果你想知道如何做,只需评论,我会解释代码。

+0

有人可以解释为什么这是被投票吗?这是一个完全合理的答案 – sbowde4

+0

我也试过这个。我仍然有同样的问题:/ *在BST每个节点是一个学生的记录,这样的姓氏和名字都在同一节点 – Chie

+0

哦,我并没有意识到这一点。我以为你只是在树中插入第一个列表和姓氏列表。 – sbowde4

0

的主要问题是,你不必为你的钥匙一个适当的“偏序”。关键比较逻辑需要是这样的:

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:在代码中,你建树,你完全使用错误的关键。在搜索树时以及决定向树中添加新节点的位置时,您需要使用相同的密钥/密钥对和相同的比较逻辑。

+0

仍然是同样的问题:/ – Chie

+0

1)你修正的代码是什么样的? 2)也许你在构建树的代码中犯了同样的错误! –

+0

我已经张贴的答案,因为我们不能发表长注释 – Chie