Java 插入树中
编辑:正确的解决方案:Java 插入树中,java,tree,Java,Tree,编辑:正确的解决方案: 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)
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添加(学生)
{
if(root==null)
根=新树节点;
其他的
插入(根,s);
}
空白插入物(田纳西州TreeNode,学生s)
{
如果(总体积比大于0)
{
如果(tn.left!=null)
插入物(tn.左侧,s);
其他的
{
tn.左=新的树节点;
tn.left.parent=tn;
}
}
否则如果(总体积比小于0)
{
如果(tn.right!=null)
插入(右侧,s);
其他的
{
tn.右侧=新的树节点;
tn.right.parent=tn;
}
}
天平(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);
}
void添加(学生)
{
插入(根,s);
}
私人空白插入(TreeNode t,学生s)
{
如果(t==null)
t=新的树节点;
如果(t.sVal.比较大于0)
插入(t.右,s);
否则如果(t.sVal.比较小于0)
插入(t.左,s);
}
然而,树仍然是空的,我不知道为什么。我不想这么含糊,但我找不到逻辑上的错误。我遗漏了什么?您的代码显示了对Java的基本误解,我将尽力帮助您理解错误所在 调用
insert(root,s)
时,将引用传递给root
指向的同一TreeNode对象。然后在insert
函数中指定t=new TreeNode
时,您将新引用指定给t
,非指定给root
Java是按值传递的,对于对象,这意味着它正在传递引用的值。如果你知道C,你可以把它看作一个指针。它传递的是内存地址,而不是指向内存地址的指针。您的代码显示了对Java的基本误解,我将尽力帮助您理解错误所在 调用
insert(root,s)
时,将引用传递给root
指向的同一TreeNode对象。然后在insert
函数中指定t=new TreeNode
时,您将新引用指定给t
,非指定给root
Java是按值传递的,对于对象,这意味着它正在传递引用的值。如果你知道C,你可以把它看作一个指针。它传递的是内存地址,而不是指向内存地址的指针。这里有一个很大的提示:首先进行此更改,然后从那里进行调试:
if (t == null)
throw new IllegalArgumentException();
还有一个更大的提示:创建新节点时,还必须有对其父节点的引用,以便可以将其添加到父节点。这里有一个大提示:首先进行此更改,然后从那里进行调试:
if (t == null)
throw new IllegalArgumentException();
还有一个更大的提示:创建新节点时,还必须有对其父节点的引用,以便可以将其添加到父节点。这是一个指针问题。使用
=
运算符重新定义指针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()
方法应该可以做到这一点。如果您需要递归树实现,在线上有各种资源:这是指针问题。使用=
运算符重新定义指针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()
方法应该可以做到这一点。如果您需要递归树实现,有各种在线资源:方法调用insert(root,s)中的root是什么代码>?您所要做的就是创建一个新的树节点——您永远不会将它插入树中。@DaveNewton-分配给t的新节点,它应该引用树中的一个节点。例如,如果树为空,则根为null,并且root=t=newnode。至少,我所遵循的逻辑是正确的,这就是为什么你所做的是失败的,因为你所做的假设是不正确的。@Lion-root是树的根节点what isroot
在这里的方法调用insert(root,s)代码>?您所要做的就是创建一个新的树节点——您永远不会将它插入树中。@DaveNewton-分配给t的新节点,它应该引用树中的一个节点。例如,如果树为空,则根为null,并且root=t=newnode。至少,我所遵循的逻辑是正确的,这就是为什么你所做的是失败的,因为你所做的假设是错误的。@Lion-root是根源