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 is
root
在这里的方法调用
insert(root,s)?您所要做的就是创建一个新的树节点——您永远不会将它插入树中。@DaveNewton-分配给t的新节点,它应该引用树中的一个节点。例如,如果树为空,则根为null,并且root=t=newnode。至少,我所遵循的逻辑是正确的,这就是为什么你所做的是失败的,因为你所做的假设是错误的。@Lion-root是根源