1 回答
TA贡献1995条经验 获得超2个赞
你有几个问题。
在下面的代码中查看我的评论。
if (root.value < node.value) {
if (node.right == null) {
root.right = new Node(node.value);
log.info("node.right.value:" + root.right.value);
}
} else { //<--- delete the right(}) curly brace.
// because your else clause is in the wrong place
log.info("insert(node.right):" + root.right.value);
insert(root.right);
}
}
正如我在评论中所说,您需要停止使用root
进行比较。不会更改root
以反映递归调用中的节点更改。所以你一遍又一遍地替换相同的值。
更新答案从这里开始。
这是我在保持代码不变方面所能做的最好的事情。主要问题是您一遍又一遍地使用相同的 root 值。所以我添加了一个插入方法,它同时获取了根和节点。我不会这样做的。这就是我会做的。
首先通过
values
,而不是nodes
插入方法。制作一个
second insert method
需要 anode
和的 avalue
。如果 the
root
为 null,则创建 anode with the value
并分配它。insert(node, value)
否则,根据需要递归调用using left 或 right。如果null
,则创建一个具有值的新节点并分配它。
这是你的修改版本。我还添加了一个静态打印例程。
public class TreeDemo {
public static void main(String[] args) {
Tree t = new Tree();
t.insert(new Node(-1));
t.insert(new Node(5));
t.insert(new Node(8));
t.insert(new Node(-10));
t.insert(new Node(4));
t.insert(new Node(-3));
t.insert(new Node(9));
t.insert(new Node(12));
print(t.root);
}
public static void print(Node n) {
if (n.left != null) {
print(n.left);
}
// print inorder
System.out.println(n.value);
if (n.right != null) {
print(n.right);
}
}
}
class Node {
Node left = null;
Node right = null;
float value = 0;
public Node(float value) {
this.value = value;
left = null;
right = null;
}
}
class Tree {
Node root;
public Tree() {
root = null;
}
public void insert(Node node) {
if (root == null) {
root = node;
return;
}
insert(root, node);
}
// added this method
private void insert(Node troot, Node node) {
if (troot.value > node.value) {
if (troot.left == null) {
troot.left = node;
}
else {
insert(troot.left, node);
}
}
else {
if (troot.value <= node.value) {
if (troot.right == null) {
troot.right = node;
}
else {
insert(troot.right, node);
}
}
}
}
}
添加回答
举报