Построение двоичного дерева в 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;
    }
}

4 ответов


Я думаю, что это то, что вы ищете:

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

}

идея двоичного дерева заключается в том, что оно сортируется. Любые значения больше текущего значения находятся в правом узле, а каждое меньшее значение-в левом узле. Это означает, что вы не должны делать построение дерева в своей основной программе. Скорее, каждый узел должен иметь метод "insert", который определяет, должен ли новый узел идти влево или вправо от текущего узла. Когда у вас есть новый узел, вы создаете этот узел, а затем вызываете root.insert(newNode).

insert-метод будет тогда работайте так (потому что это, очевидно, студенческое задание, и вы должны учиться на нем, вы получаете только псевдокод от меня, нет полного решения):

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 который является уже работающей реализацией двоичного дерева.


на мой взгляд, поскольку мы не уверены, какая реализация BinaryTree, когда дело доходит до некоторых методов, таких как add и traverse, лучше всего сделать его абстрактным классом. Я уверен, что этого кода достаточно для общей реализации 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;
    }

}

то, что вы делаете, отлично выглядит в качестве отправной точки (хотя вы можете добавить ссылку на родительский узел, если планируете перемещать узлы в дереве или выполнять обратные обходы).

в зависимости от того, что вы используете двоичное дерево, хотя вы можете просто использовать TreeMap.

проблема в том, что мы не знаем, для чего вы используете свое двоичное дерево, и многие сложности проектирования и реализации и решения происходят из что.