2016-11-14 46 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