0

Java でを作成しようとしてきましたがinteger binary search tree、何らかの理由で、新しいノードをツリーに追加することに失敗しました。

これがNODEクラスです。

class NODE
{
    NODE left = null, right = null;
    int info;
    public NODE(int x)
    {
        info = x;
    }
}

メソッドを使用したBST(Binary Seatch Tree) クラスを次に示しinsert()ます。

class BST
{
    NODE tree = null;
    public void insert(int x)
    {
        NODE node = new NODE(x);
        NODE temp = tree;
        while(true)
        {
            if(temp == null)
            {
                temp = node;
                break;
            }
            else if(temp.info > x) temp = temp.left;
            else temp = temp.right;
        }
    }
    //other methods present here
}

私が理解できなかった理由で、 insert()方法が間違っています。

メソッドが呼び出された後でも、オブジェクトtreeはそれを保持します。nullinsert()

コードにむらがあるものを見つけることができますか?

ありがとう!

4

3 に答える 3

4

クラスで再帰的なinsertメソッドを使用NODEします (あなたが行ったように無限ループを利用する代わりに):

public void insert(int x) {
        if(x < this.info) {
            if(this.left == null)
                this.left = new NODE(x);
            else
                this.left.insert(x);
        }
        else {
            if(this.right == null)
                this.right = new NODE(x);
            else
                this.right.insert(x);
        }
    }

BSTクラスには次のメソッドがありますinsert(単に他のinsertメソッドを呼び出します):

public void insert(int x) {
    if(tree == null)
        tree = new NODE(x);
    else
        tree.insert(x);
}

ツリー内のノードで自分自身を再帰的に呼び出す必要があるため、 maininsertメソッドはクラス内にあります。NODE

于 2013-10-30T16:00:17.950 に答える
1

もちろん、ツリーは null のままです。このフィールドには何も割り当てません。temp = tree の後; temp = ノード; ツリーではなく、一時のみが変更されます。

于 2013-10-30T17:01:13.510 に答える
0

insert() メソッドは、ノードの子をツリーに挿入し、すでに宣言されている Node をパラメーターとして呼び出します。例えば:

//Returns true/false depending on whether the insert is successful
public boolean insert(int x, Node node, boolean leftChild) {      
    if (node == null) return false;
    Node child = new Node(x);
    if (leftChild) {
        if (node.left != null) return false;
        node.left = child;
    } else {
        if (node.right != null) return false;
        node.right = child;
    }
    return true;
}
于 2013-10-30T16:21:34.920 に答える