为什么在我的 BST 中序遍历中显示的是指针而不是字符串?
Why pointers are shown instead of string in my inorder traversal of BST?
打印二叉搜索树中序遍历的代码如下:
public class 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 class:
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
我的 Java 不新鲜,但我想你想像这样定义 BSTNode
左右节点成员:
public class BSTNode<E> {
private E value;
private BSTNode<E> leftNode=null;
private BSTNode<E> rightNode=null;
}
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 显示黄色警告指示器的所有这些地方吗?如果您将鼠标悬停在那些地方,它会说您没有正确使用泛型?如果在 IDE 警告您时包含了 <E>
,编译器会为您捕获 setLeftNode
和 setRightNode
中的错误。
你的setleft/right实际上是错误的:
它们应该是:
public void setRightNode(BSTNode rootRight){
this.rightNode=rootRight;
}
public void setLeftNode(BSTNode rootLeft){
this.leftNode=rootLeft;
}
您已经有一个节点 - 所以您只需要设置它。无需创建额外的节点对象。
提示:如果您查看 ide 中的 java 警告,您会发现它抱怨您应该参数化一些值(始终在 BSTNode 的所有部分使用 BSTNode)。添加后,它会告诉你它不能在你的set*Node函数中将BSTNode转换为E。
打印二叉搜索树中序遍历的代码如下: public class 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 class:
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
我的 Java 不新鲜,但我想你想像这样定义 BSTNode
左右节点成员:
public class BSTNode<E> {
private E value;
private BSTNode<E> leftNode=null;
private BSTNode<E> rightNode=null;
}
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 显示黄色警告指示器的所有这些地方吗?如果您将鼠标悬停在那些地方,它会说您没有正确使用泛型?如果在 IDE 警告您时包含了 <E>
,编译器会为您捕获 setLeftNode
和 setRightNode
中的错误。
你的setleft/right实际上是错误的:
它们应该是:
public void setRightNode(BSTNode rootRight){
this.rightNode=rootRight;
}
public void setLeftNode(BSTNode rootLeft){
this.leftNode=rootLeft;
}
您已经有一个节点 - 所以您只需要设置它。无需创建额外的节点对象。
提示:如果您查看 ide 中的 java 警告,您会发现它抱怨您应该参数化一些值(始终在 BSTNode 的所有部分使用 BSTNode)。添加后,它会告诉你它不能在你的set*Node函数中将BSTNode转换为E。