2015-10-03 2 views
1

Вот код для печати заказовМои обхода двоичного дерева поиска: общественного класса BSTPrint {Почему указатели отображаются вместо строки в моем обходном пути BST?

public void printInorder(BSTNode root){ 
    if (root!=null){ 
     printInorder(root.getLeftNode()); 
     System.out.println(root.getNodeValue()); 
     printInorder(root.getRightNode()); 
    } 

} 

public static void main(String[] argc){ 
    BSTPrint bstPrint = new BSTPrint(); 
    BSTNode<String> root=new BSTNode<String>(); 
    root.setNodeValue("5"); 
    BSTNode<String> rootLeft= new BSTNode<String>(); 
    rootLeft.setNodeValue("3"); 
    root.setLeftNode(rootLeft); 
    BSTNode<String> rootRight= new BSTNode<String>(); 
    rootRight.setNodeValue("8"); 
    root.setRightNode(rootRight); 
    bstPrint.printInorder(root); 
} 
} 

Вот класс BSTNode:

public class BSTNode<E> { 
    private E value; 
    private BSTNode<E> leftNode=null; 
    private BSTNode<E> rightNode=null; 

    public BSTNode getLeftNode(){ 
     return this.leftNode; 
    } 
    public void setLeftNode(BSTNode rootLeft){ 
     BSTNode newLeftNode=new BSTNode(); 
     newLeftNode.leftNode=null; 
     this.leftNode=newLeftNode; 
     newLeftNode.value=rootLeft; 
    } 
    public BSTNode getRightNode(){ 
     return this.rightNode; 
    } 
    public void setRightNode(BSTNode rootRight){ 
     BSTNode newRightNode=new BSTNode(); 
     newRightNode.rightNode=null; 
     this.rightNode=newRightNode; 
     newRightNode.value=rootRight; 
    } 

    public E getNodeValue(){ 
     return this.value; 
    } 

    public void setNodeValue(E value){ 
     this.value=value; 
    } 

} 

Почему я вижу мой результат, как следующее ?

[email protected] 
5 
[email protected] 

вместо

3 
5 
8 
+1

Ваши дженерики все испорчены. – Rishav

+0

Полностью несвязанный, но вот как ваш код должен выглядеть с надлежащими дженериками. http://ix.io/l9P – Rishav

ответ

1

Ваш setleft/вправо, на самом деле не так:

они должны быть:

public void setRightNode(BSTNode rootRight){ 
    this.rightNode=rootRight; 
} 
public void setLeftNode(BSTNode rootLeft){ 
    this.leftNode=rootLeft; 
} 

У вас уже есть узел - так что вам просто нужно установить его. нет необходимости создавать дополнительный узел.

Подсказка: если вы посмотрите на предупреждения java в своем представлении, вы обнаружите, что он жалуется, что вы должны параметризовать некоторые из ваших значений (всегда используйте BSTNode во всех частях BSTNode). После того, как вы добавите его, он скажет вам, что он не может преобразовать BSTNode в E в установленных вами функциях Node.

+0

Спасибо за разъяснения. Теперь это имеет смысл для меня :) –

1

Не свежее на моем Java, но я думаю, что вы хотите, чтобы определить BSTNode левые и правые элементы узла, как так:

public class BSTNode<E> { 
    private E value; 
    private BSTNode<E> leftNode=null; 
    private BSTNode<E> rightNode=null; 
} 
+0

Я пробовал это, я все равно получаю тот же результат. –

+0

Вы используете 'BSTNode' довольно много раз вместо' BSTNode 'внутри вашего класса' BSTNode '. Я подозреваю, что это связано с этим. Логика для печати в порядке кажется мне прекрасной. –

4

printInOrder работает нормально , Значение левого узла не равно 3; Значение левого узла является другой узел, так как setLeftNode:

public void setLeftNode(BSTNode rootLeft){ 
    BSTNode newLeftNode=new BSTNode(); 
    newLeftNode.leftNode=null; 
    this.leftNode=newLeftNode; 
    newLeftNode.value=rootLeft; 
} 

не зацепив при условии rootLeft узла в this.leftNode. Он создает еще один узел, который должен быть leftNode, и устанавливает значение этого узла - rootLeft. Та же проблема появляется в setRightNode.

Вам необходимо исправить setLeftNode и setRightNode. Кроме того, если вы используете IDE (например, Eclipse), вы знаете все те места, где ваша IDE показывает желтые предупреждающие индикаторы? Те, где, если вы наводите на них курсор, говорится, что вы не используете дженерики правильно? Если бы вы включили <E>, когда IDE предупреждало вас об этом, компилятор поймал бы ошибки в setLeftNode и setRightNode для вас.

+0

Upvote для ловли 'newLeftNode.value = rootLeft'. –