我是Java的新手,我一直在尝试实现BST,但程序只输出最后插入的值。我的root_node
指向的是什么?以下是Tree.java
和Node.java
的源代码。
Tree.java
public class Tree {
private Node root_node;
public void Tree() {
this.root_node = null;
}
public void insertNode (int value) {
root_node = insertNode(root_node, value);
}
public Node insertNode (Node node, int insert_value) {
if (node == null) {
return (new Node(insert_value));
}
else {
if (node.getNodeValue() < insert_value)
node = insertNode(node.getLeftNode(), insert_value);
else
node = insertNode(node.getRightNode(), insert_value);
return (node);
}
}
public void printNode () {
printNode(root_node);
}
public void printNode (Node node) {
if (node != null){
System.out.print(node.getNodeValue() + " ");
printNode(node.getLeftNode());
printNode(node.getRightNode());
}
}
public static void main(String[] args) {
Tree tree = new Tree();
tree.insertNode(54);
tree.insertNode(87);
tree.insertNode(11);
tree.insertNode(25);
tree.printNode();
}
}
Node.java
public class Node {
private int node_value;
private Node left_node, right_node;
public Node(int root_value) {
this.node_value = root_value;
this.left_node = null;
this.right_node = null;
}
public int getNodeValue() { return (this.node_value); }
public Node getLeftNode() { return (this.left_node); }
public Node getRightNode() { return (this.right_node); }
}
错误是我的源代码只显示最后插入的no。在这种情况下,这是25。
答案 0 :(得分:1)
似乎发生了这样的错误:
您使用第一次调用创建root_node
(应遵循java约定称为rootNode
)。
然后你调用getLeftNode或getRightNode,但那些不存在,所以我猜他们会返回null
。
if (node.getNodeValue() < insert_value)
node = insertNode(node.getLeftNode(), insert_value);
else
node = insertNode(node.getRightNode(), insert_value);
在第二次调用时返回null。
现在你的root_node
再次为空,结果是你只有最后插入的值等等。所以这似乎是你的代码只在你调用print时返回最后一个节点值的原因。 / p>
答案 1 :(得分:1)
insertNode
的实施不正确。
您始终使用以下方法调用此方法:
root_node = insertNode(root_node, value);
然后,如果你看一下这个方法:
if (node == null) { return (new Node(insert_value)); } else { if (node.getNodeValue() < insert_value) node = insertNode(node.getLeftNode(), insert_value); else node = insertNode(node.getRightNode(), insert_value); return (node); }
在第一次通话时,第一个if
条件将匹配,
将创建一个新节点并将其分配给呼叫者中的root_node
。
但是,
在随后的电话中,会发生什么?
第一个if
不匹配,因此将else
块。
但是之后,
两个分支都重新分配方法的 node
参数。
因此else
方法的效果将保留在insertNode
方法中,因此不会添加任何其他值。
除了重写insertNode
方法之外,
你也需要其他的改变。
例如,
目前无法设置或修改节点的左右节点。
您需要通过setter或构造函数为此添加一些方法。
例如,添加了适当的setter后,这将起作用:
public Node insertNode(Node node, int insert_value) {
if (node == null) {
return new Node(insert_value);
}
if (node.getNodeValue() < insert_value) {
node.setLeftNode(insertNode(node.getLeftNode(), insert_value));
} else {
node.setRightNode(insertNode(node.getRightNode(), insert_value));
}
return node;
}
答案 2 :(得分:1)
在Tree
课程中,mehtod public Node insertNode (Node node, int insert_value)
不正确,请大声这样说:
if (node.getNodeValue() < insert_value) {
Node left = insertNode(node.getLeftNode(), insert_value);
node.left_node = left;
}
else {
Node right = insertNode(node.getRightNode(), insert_value);
node.right_node=right;
}
您应该将insertNode
返回的新节点保存到左子节点字段或右子节点字段中,如果不是,printNode
将只打印root
节点return,因为root
节点的左或右子节点为null
。