web-dev-qa-db-ja.com

Javaでのバイナリツリーの構築

バイナリツリーを構築しています。これが正しい方法かどうかを教えてください。そうでない場合は、教えてください?一般的なバイナリツリーの構築がコーディングされている適切なリンクが見つかりませんでした。どこでもBSTがコーディングされています。

  3
 / \
1   4
   / \
  2   5

これは私が作りたいバイナリツリーです。すべてのツリートラバーサルを行うことができるはずです。

public class Binarytreenode
{
    public Binarytreenode left;
    public Binarytreenode right;
    public int data;

    public Binarytreenode(int data)
    {
        this.data=data;
    }

    public void printNode()
    {
        System.out.println(data);
    }

    public static void main(String ar[])
    {
        Binarytreenode root = new Binarytreenode(3);
        Binarytreenode n1 = new Binarytreenode(1);
        Binarytreenode n2 = new Binarytreenode(4);
        Binarytreenode n3 = new Binarytreenode(2);
        Binarytreenode n4 = new Binarytreenode(5);

        root.left = n1;
        root.right = n2;
        root.right.left = n3;
        root.right.right = n4;
    }
}
14
VIN

これがあなたが探しているものだと思います:

public class Binarytree
{
    private static Node root;

    public Binarytree(int data)
    {
        root = new Node(data);
    }

    public void add(Node parent, Node child, String orientation)
    {
        if (orientation.equals("left"))
        {
           parent.setLeft(child);
        }
        else
        {
            parent.setRight(child);
        }
    }

    public static void main(String args[])
    {
        Node n1 = new Node(1);
        Node n2 = new Node(4);
        Node n3 = new Node(2);
        Node n4 = new Node(5);

        Binarytree tree = new Binarytree(3); //  3
        tree.add(root, n1, "left"); //         1/ \
        tree.add(root, n2, "right"); //            4
        tree.add(n2, n3, "left"); //             2/ \
        tree.add(n2, n4, "right"); //                5
    }
}

class Node {
    private int key;
    private Node left;
    private Node right;

    Node (int key) {
        this.key = key;
        right = null;
        left = null;
    }

    public void setKey(int key) {
        this.key = key;
    }

    public int getKey() {
        return key;
    }

    public void setLeft(Node left) {
        this.left = left;
    }

    public Node getLeft() {
        return left;
    }

    public void setRight(Node right ) {
        this.right = right;
    }

    public Node getRight() {
        return right;
    }

}
16
user11057

バイナリツリーの背後にある考え方は、ソートされるということです。現在の値より大きい値は右側のノードにあり、小さい値はすべて左側のノードにあります。つまり、メインプログラムでツリー構築を行うべきではありません。むしろ、すべてのノードには、新しいノードが現在のノードの左側に行くか右側に行くかを決定する「挿入」メソッドが必要です。新しいノードを作成したら、そのノードを作成し、root.insert(newNode)を呼び出します。

Insert-methodは次のように動作します(これは明らかに学生の課題であり、あなたはそれから学ぶことになっているので、完全な解決策ではなく、私から擬似コードを取得するだけです):

When value is smaller than own value:
     When there already is a left-node:
         call left-node.insert(new-node)
     When there isn't a left-node yet:
         the left-node is now the new-node
When value is larger than own value:
     When there already is a right-node:
         call right-node.insert(new-node)
     When there isn't a right-node yet:
         the right-node is now the new-node
When value is equal to own value:
     Duplicate value. Either ignore the value or throw an exception.

オブジェクトがすでにツリー内にあるかどうかを確認する方法も同じです。

When requested value is equal to the value of this node
     return this node
When the requested value is smaller
     When a left node exists
         call left.find(value)         
     When no left node exists
          value doesn't exist in this tree
When the requested value is larger
     When a right node exists
         call right.find(value)         
     When no right node exists
          value doesn't exist in this tree

実際にバイナリツリーがどのように機能するかを学びたくない場合は、単に TreeSet を使用してください。これは既に動作しているバイナリツリーの実装です。

6
Philipp

私の意見では、BinaryTreeが追加やトラバースなどのメソッドに関してどのような実装であるかわからないので、最善の策はそれを抽象クラスにすることです。このコードが一般的なBinarytreeの実装に十分であると確信しています。

あなたが望むのは二分木の後継者のインスタンスですが、私はそのインスタンスを疑います。

public abstract class Binarytree
{
    private Node root;

    public Binarytreenode(int data)
    {
        root = new Node(data);
    }

    public abstract void add(int key);

    public abstract void traverse();


}

class Node {
    private int key;
    private Node left;
    private Node right;
    Node (int key) {
        this.key = key;
        right = null;
        left = null;
    }

    public void setKey(int key) {
        this.key = key;
    }

    public int getKey() {
        return key;
    }

    public void setLeft(Node left) {
        this.left = left;
    }

    public Node getLeft() {
        return left;
    }

    public void setRight(Node right ) {
        this.right = right;
    }

    public Node getRight() {
        return right;
    }

}
2
Hoodlum

あなたがしていることは、出発点としてうまく見えます(ただし、ツリー内でノードを移動したり、逆方向のトラバースを行うことができる場合は、親ノードへの参照を追加することもできます)。

TreeMapを使用することもできますが、バイナリツリーの使用目的によって異なります。

問題は、あなたがバイナリツリーを何のために使用しているかわからないことであり、設計と実装の複雑さと決定の多くはそこから生じています。

0
Tim B