插入树中

时间:2012-04-10 20:10:48

标签: 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)
            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);                
}

然而,树仍然是空的,我无法弄清楚原因。我讨厌这么模糊,但我在逻辑中找不到错误。我错过了什么?

3 个答案:

答案 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