web-dev-qa-db-ja.com

再帰的二分探索木挿入

これが私の最初のJavaプログラムですが、数年間c ++を実行しました。動作するはずだと思うものを書きましたが、実際には動作しません。それで、次のように規定しました。この呼び出しのメソッドを作成するには:

tree.insertNode(value);

ここで、valueはintです。明らかな理由で再帰的に書きたかったので、回避策を講じる必要がありました。

public void insertNode(int key) {
    Node temp = new Node(key);

    if(root == null) root = temp;

    else insertNode(temp);
}

public void insertNode(Node temp) {
    if(root == null)
        root = temp;

    else if(temp.getKey() <= root.getKey())
        insertNode(root.getLeft());

    else insertNode(root.getRight());
}

アドバイスありがとうございます。

6
Nick Sinklier
// In Java it is little trickier  as objects are passed by copy.
// PF my answer below.

// public calling method

public void insertNode(int key) {
    root = insertNode(root, new Node(key));
}

// private recursive call

private Node insertNode(Node currentParent, Node newNode) {

    if (currentParent == null) {
        return newNode;
    } else if (newNode.key > currentParent.key) {
        currentParent.right = insertNode(currentParent.right, newNode);
    } else if (newNode.key < currentParent.key) {
        currentParent.left = insertNode(currentParent.left, newNode);
    }

    return currentParent;
}

同じスクマラン

18
user2986935

コードは、オーバーロードされた関数と少し混乱しているように見えます。メンバー変数「left」と「right」がそれぞれBSTreeの左の子と右の子であると仮定すると、次の方法で実装を試みることができます。

 public void insert(Node node, int value) {
    if (value < node.value)
    {
        if (node.left != null)
        {
            insert(node.left, value);
        } 
        else
        {     
            node.left = new Node(value);
        }
    } 
    else if (value > node.value)
    {
        if (node.right != null)
        {
            insert(node.right, value);
        }
        else
        {
            node.right = new Node(value);
        }
    }
}

........
public static void main(String [] args)
{ 
     BSTree bt = new BSTree();
     Node root = new Node(100);
     bt.insert(root, 50);
     bt.insert(root, 150);
}
3
Arkanoid

この記事をご覧ください。ツリー構造と検索の実装、メソッドの挿入に役立ちます: http://quiz.geeksforgeeks.org/binary-search-tree-set-1-search-and-insertion/

// This method mainly calls insertRec()
void insert(int key) {
   root = insertRec(root, key);
}

/* A recursive function to insert a new key in BST */
Node insertRec(Node root, int key) {

    /* If the tree is empty, return a new node */
    if (root == null) {
        root = new Node(key);
        return root;
    }

    /* Otherwise, recur down the tree */
    if (key < root.key)
        root.left = insertRec(root.left, key);
    else if (key > root.key)
        root.right = insertRec(root.right, key);

    /* return the (unchanged) node pointer */
    return root;
}
1
L01c

新しいオブジェクトタイプIntegerを作成する代わりに、標準のNode(プリミティブintのラッパー)オブジェクトを使用できます。最新のJava Integer/int auto-boxingがサポートされています。したがって、メソッドinsertNode(int key)Integer引数も取り込むことができます( nullでないことを確認してください)。

編集:plsは上記のコメントを無視します。私はあなたの本当の質問を理解していませんでした。 insertNode()をオーバーロードする必要があります。私はあなたが正しいと思います。

0
Bimalesh Jha

しかし、あなたがinsertNode ??現在の実装では、rootがnullでない場合、tempは失われます。

私はあなたがのようなものが欲しいと思います

root.getLeft().insertNode(temp);

そして

root.getRight().insertNode(temp);

つまり、新しいNode(temp)を左または右のサブツリーに挿入します。

0
user000001