以下是打印二叉搜索树的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
答案 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
。
您需要修复setLeftNode
和setRightNode
。此外,如果您正在使用IDE(例如Eclipse),那么您知道IDE显示黄色警告指示符的所有位置吗?如果你将鼠标放在它们上面,它说你没有正确使用泛型?如果您在IDE向您发出警告时已包含<E>
,那么编译器就会抓住setLeftNode
和setRightNode
中的错误。
答案 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.