编辑:正确的解决方案:
void add(Student s)
{
if(root == null)
root = new TreeNode(s);
else
insert(root,s);
}
void insert(TreeNode tn, Student s)
{
if(tn.sVal.compareTo(s) > 0)
{
if(tn.left != null)
insert(tn.left, s);
else
{
tn.left = new TreeNode(s);
tn.left.parent = tn;
}
}
else if(tn.sVal.compareTo(s) < 0)
{
if(tn.right != null)
insert(tn.right, s);
else
{
tn.right = new TreeNode(s);
tn.right.parent = tn;
}
}
balance(tn);
}
我正在尝试使用以下内容插入二叉树:
void add(Student s)
{
insert(root,s);
}
private void insert(TreeNode t, Student s)
{
if(t == null)
t = new TreeNode(s);
else if(t.sVal.compareTo(s) > 0)
insert(t.right, s);
else if(t.sVal.compareTo(s) < 0)
insert(t.left,s);
}
然而,树仍然是空的,我无法弄清楚原因。我讨厌这么模糊,但我在逻辑中找不到错误。我错过了什么?
答案 0 :(得分:3)
这是一个很大的提示:首先进行此更改,然后从那里进行调试:
if (t == null)
throw new IllegalArgumentException();
还有一个更大的提示:当您创建新节点时,您还必须具有对其父节点的引用,以便您可以将其添加到父节点。
答案 1 :(得分:2)
您的代码显示了对Java的基本误解,我将尽力帮助您了解您出错的地方。
当您致电insert(root,s)
时,您将引用传递给root
指向的同一TreeNode 对象。当您在t = new TreeNode(s)
函数中分配insert
时,您将新参考分配给t
,不分配给{{1} }}
Java是按值传递的,对于对象,这意味着它传递了引用的值。如果你知道C,你可以把它想象成一个指针。它传递的是内存地址,而不是传递指向内存地址的指针。
答案 2 :(得分:0)
这是一个指针问题。使用a
运算符重新定义指针=
时,之前对a
的所有引用都将丢失。为了保留这些引用,您必须使用成员函数(Java中的类方法)更改对象,或者将代码编写为直接修复引用。
简单地说,重新定义指针只会影响该指针。已经引用指针的任何内容都将不更新。
伪代码示例:
Node a = new Node("hello")
Node b = a
a = new Node("goodbye")
print(a) // this prints "goodbye"
print(b) // this prints "hello"
为了让b
指向新的a
,您必须写b = a
。
对此进行排序后,您需要重写insert()
方法。因为树是递归的,所以递归insert()
方法应该可以解决问题。如果您需要递归树实现,可以在线使用各种资源:Recursive Tree Java