2016-11-14 52 views
2

我一直想弄清楚如何编辑我的给定代码,如果它已经存在,它将不允许元素进入我的二叉树。我的提示是修改测试器以外的两个不同的类来完成。如何不允许将重复项添加到二进制搜索树中?

我第一类是:

public void addNode(Node <T> newNode){ 
     Comparable<T> tempElement = (Comparable<T>) newNode.element; 

     int comp = tempElement.compareTo(element); 
      if (comp < 0) 
      { 
      if (left == null) 
       {left = newNode;} 
      else 
       {left.addNode(newNode);} 
      } 
      else 
      { 
      if (right == null) 
       {right = newNode;} 
      else 
       {right.addNode(newNode);} 

      } 
    } 

而第二个是:

public void add(T obj) // add root first 
    { 
     Node<T> newNode = new Node<T>(obj); 
     if (root == null) { 
      root = newNode; 
     } else { 
      root.addNode(newNode); 
     } 
     count++; 

    } 

如果有人可以帮助我将不胜感激!

+0

'如果(化合物== 0)';或者如果(comp> 0)'将'else'改为'else。 –

+0

我对演员''(可比)''抱有怀疑。如果你已经将'element'声明为'T元素;'并且通过'>'来限定'T',那么你不需要明确地进行转换。 –

回答

0

尝试将您的项目添加到Set中,因为集合只允许一个项目相等的实例。

Set items=new HashSet(); 
+1

OP正在实施BST。把东西放进一个'Set'有点失败了。 –

2

假设您正在使用与等于一致的Comparable实例;那就是:

a.compareTo(b) == 0 

在当前的代码来实现这一点的最简单方法就是检查的comp值:

a.compareTo(b) == 0 iff a.equals(b) 

然后,你可以简单地通过检查的情况下消除重复

if (comp < 0) 
{ 
    // Insert to the left, as you currently do. 
} 
else if (comp > 0) 
{ 
    // Insert to the right, as you currently do. 
} 
else 
{ 
    // Handle the duplicate: maybe do nothing, maybe throw an exception etc. 
    // If you want to do nothing, you don't need the else block at all. 
} 

为了解决这个问题的后半部分,改变你addNode返回boolean的方法,其中true表示已添加节点,而false则不是。

然后:

Node<T> newNode = new Node<T>(obj); 
if (root == null) { 
    root = newNode; 
    count++; // "added" unconditionally. 
} else { 
    if (root.addNode(newNode)) count++; // Only increment if it was really added. 
} 
+0

我即将发布这个确切的答案,但你击败了我。这是对的。 +1 – nhouser9

+0

谢谢!这帮助了我的问题的前半部分。哈哈现在我需要改变“计数”代码,如果在测试者上添加了副本但不添加到树中,则计数应保持相同而不是增加。例如,这应该返回6而不是8:myBST.add(10); \t \t myBST.add(7); \t \t myBST.add(15); \t \t myBST.add(3); \t \t myBST.add(3); \t \t myBST.add(9); \t \t myBST.add(8); \t \t myBST.add(8); \t \t return myBST; – Kahveed

+0

再次感谢您的帮助,我仍然没有100%完成工作,我仍然遇到困难,但我不希望您为我完成工作。 – Kahveed