为什么在我的BST顺序遍历中显示指针而不是字符串?

时间:2015-10-03 06:12:06

标签: java tree binary-tree binary-search-tree tree-traversal

以下是打印二叉搜索树的inorder遍历的代码:     公共课BSTPrint {

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;
    }

}

为什么我会看到以下结果?

BSTNode@246f9f88
5
BSTNode@1c52ac68

而不是

3
5
8

3 个答案:

答案 0 :(得分:4)

printInOrder工作得很好。左边节点的值不是t 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

您需要修复setLeftNodesetRightNode。此外,如果您正在使用IDE(例如Eclipse),那么您知道IDE显示黄色警告指示符的所有位置吗?如果你将鼠标放在它们上面,它说你没有正确使用泛型?如果您在IDE向您发出警告时已包含<E>,那么编译器就会抓住setLeftNodesetRightNode中的错误。

答案 1 :(得分:1)

我的Java上并不新鲜,但我认为您想要定义BSTNode左右节点成员,如下所示:

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

答案 2 :(得分:1)

你的setleft / right实际上是错误的:

他们应该是:

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

您已经有一个节点 - 所以您只需要设置它。无需创建额外的节点对象。

提示:如果你看一下你的ide中的java警告,你会发现它会抱怨你应该参数化你的一些值(总是在BSTNode的所有部分使用BSTNode)。添加后,它会告诉您在设置*节点功能时它无法将BSTNode转换为E.