0

編集:適切な解決策:

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);                
}

しかし、木は空のままで、理由がわかりません。漠然としているのは嫌いですが、ロジックにエラーが見つかりません。私は何が欠けていますか?

4

3 に答える 3

3

ここに大きなヒントがあります:最初にこの変更を行い、次にそこからデバッグします:

if (t == null)
    throw new IllegalArgumentException();

さらに大きなヒント:新しいノードを作成するときは、親に追加できるように、その親への参照も必要です。

于 2012-04-10T20:32:06.340 に答える
2

あなたのコードはJavaの基本的な誤解を示しています、そして私はあなたがどこで間違っているのかを理解するのを助けるように努めます。

を呼び出すと、が指す同じTreeNodeオブジェクトへの参照insert(root,s)が渡されます。次に、関数内で割り当てると、にではなく、に新しい参照割り当てられます。roott = new TreeNode(s)inserttroot

Javaは値渡しであり、オブジェクトの場合は、参照の値を渡していることを意味します。Cを知っているなら、それをポインタと考えることができます。メモリアドレスを指すポインタを渡すのではなく、メモリアドレスを渡します。

于 2012-04-10T20:27:37.310 に答える
0

これはポインタの問題です。演算子aを使用してポインターを再定義すると、への以前の参照はすべて失われます。これらの参照を保持するには、メンバー関数(Javaのクラスメソッド)を使用してオブジェクトを変更するか、参照を直接修正するコードを作成する必要があります。=a

簡単に言えば、ポインターの再定義はそのポインターにのみ影響します。すでにポインタを参照しているものは更新されません。

擬似コードの例:

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()方法でうまくいくはずです。必要に応じて、再帰ツリーの実装に関するさまざまなリソースがオンラインにあります。再帰ツリーJava

于 2012-04-10T20:53:52.133 に答える