2016-09-18 54 views
1

我的二進制搜索樹不能管理多於3個節點或能夠顯示它們。我需要迭代地添加它們,並在作業中使用堆棧顯示它們,但如果它具有多於3個元素,則無法顯示BST。爲什麼我的二進制搜索樹顯示多於3個節點?

public boolean add(E b) { 

    //if tree is empty 
    if (root == null) { 
     root = new Node(); 
     root.setValue(b); 
     count++; 
     return true; 
    } //if val is already in tree 
    else if (b.compareTo(root.getValue()) == 0) { 
     return false; 
     //if left or right spot is free 
    } else { 
     while (root != null) { 
      compareResult = root.value.compareTo(b); 
      spot = root; 
      if (compareResult < 0) { 
       if (root.left != null) { 
        spot = spot.left; 
        count++; 
        return true; 
       } else { 
        Node n = new Node<>(); 
        n.setValue(b); 
        spot.left = n; 
        count++; 
        return true; 
       } 
      } else if (compareResult > 0) { 
       if (root.right != null) { 
        spot = spot.right; 
        count++; 
        return true; 
       } else { 
        Node n = new Node<>(); 
        n.setValue(b); 
        spot.right = n; 
        count++; 
        return true; 

       } 
      } else { 
       return false; 
      } 
     } 
    } 
    return false; 

} 

public void display() { 
    //needs to use an iterator 
    if (root == null) { 
     System.out.println("Error"); 
    } else { 
     Node CurrentNode; 
     CurrentNode = root; 
     while (!stack.isEmpty() || CurrentNode != null) { 
      if (CurrentNode != null) { 
       stack.push(CurrentNode); 
       CurrentNode = CurrentNode.right; 


      } 
      else { 
       Node m= stack.pop(); 
       System.out.println(m.value); 
       CurrentNode = m.left; 
      } 

     } 
    } 
} 

public int size() { 
    return count; 
} 

@Override 
public int compareTo(E t) { 
    return ordering.compare(root,t); 
} 

@Override 
public int compare(E t, E t1) { 
    return t.compareTo(t1); 
} 

Node類看起來像這樣

public class Node<E extends Comparable> { 

E value; 
Node<E> left; 
Node<E> right; 

//constructor 
public Node() { 
    value = null; 
    left = null; 
    right = null; 


} 

public void setValue(E t) { 
    value = t; 
} 

public void setLeft(Node<E> t) { 
    left = t; 

} 

public void setRight(Node<E> t) { 
    right = t; 
} 

public Node<E> getLeft() { 
    return left; 
} 

public Node<E> getRight() { 
     return right; 
} 

public E getValue() { 
    return value; 
} 
+1

這不是一個完整的答案,因爲我不會爲你做你的功課。但基本上,你的'add'方法需要遞歸。事實上,它只會在節點的根節點,左側子節點或右側子節點添加事物。你的大部分邏輯都可以被刪除,因爲如果你插入的值不是__根值,你可以再次調用'add'來通過左邊的節點。如果它的_greater大於_根值,那麼可以再次調用'add'來通過右邊的節點。您錯過了這個遞歸步驟。 –

+0

我將如何遞歸調用它? BST中的大多數對象都是Node對象,因此我無法再次調用add。我只能在E上調用Add,然後我不知道如何結束程序。 – HollyNeedsHelp

+0

你有幾個選項。你可以把'add'方法放在'Node'類中。然後,'Tree'類中的'add'方法將檢查是否存在'Node',如果存在,則調用'Node'上的'add'。或者,你可以這樣做,使得'Node'類內的'left'和'right'實際上是樹,而不僅僅是節點。 –

回答

0

我可以看到一對夫婦,你需要作出改變的。

add方法} else {線後,你應該換接下來的三線周圍,有

spot = root; 
    while (spot != null) { 
     compareResult = spot.value.compareTo(b); 

因爲spot是怎麼回事,而你迭代循環跟蹤其一路下跌的樹。但是因爲您目前使用root而不是spot,所以您始終將值與root節點進行比較,而不是降低節點。

此外,從spot = spot.left;spot = spot.right;後取出count++;return true;,因爲在這些情況下,你還沒有真正添加什麼樹,所以你需要通過循環繼續進行。