package ru.job4j.SimpleTree;

import java.util.*;

/**
 * Created by Comp on 03.10.2017.
 */
public class Tree<E extends Comparable<E>> implements SimpleTree<E> {
    private Node<E> node;
    private int size;

    public Tree(E e) {
        node = new Node<E>(e);
    }

    /*
     * метод add - Должен находить элемент parent в дереве по условию compare(node, parent) == 0 и добавлять
     * в него дочерний элемент. node.children.add(child); В дереве не могут быть дубликатов.
     * Итератор должен собрать все элементы в List и возвращать данные из скопированной коллекции.
     */
    @Override
    public boolean add(E parent, E child) {
        boolean isPresent;
        if (parent == null && child == null) {
            return false;
        }

        if (findBy(parent).isPresent()) {
            if (!findBy(child).isPresent()) {
                Node<E> node = new Node<>(child);
                findBy(parent).get().childen.add(node);
            }
            isPresent = true;
            size++;
        } else {
            isPresent = false;
        }
        return isPresent;
    }

    @Override
    public Optional<Node<E>> findBy(E value) {
        Optional<Node<E>> rsl = Optional.empty();
        Queue<Node<E>> data = new LinkedList<>();
        data.offer(this.node);
        while (!data.isEmpty()) {
            Node<E> el = data.poll();
            if (el.eqValue(value)) {
                rsl = Optional.of(el);
                break;
            }
            for (Node<E> child : el.getChilden()) {
                data.offer(child);
            }
        }
        return rsl;
    }

    @Override
    public Iterator<E> iterator() {
        return new ArrIterator();
    }

    class ArrIterator implements Iterator<E> {
        Queue<Node<E>> data = new LinkedList<>();
        {
            data.add(node);
        }

        @Override
        public boolean hasNext() {
            return !data.isEmpty();
        }

        @Override
        public E next() {
            if (!hasNext()) {
                throw new NoSuchElementException();
            }
            Node<E> el = data.poll();
            data.addAll(el.childen);
            return el.value;
        }
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Tree<?> tree = (Tree<?>) o;

        if (size != tree.size) return false;
        return node != null ? node.equals(tree.node) : tree.node == null;
    }

    @Override
    public int hashCode() {
        int result = node != null ? node.hashCode() : 0;
        result = 31 * result + size;
        return result;
    }
}
@@ -203,16 +203,40 @@
 nt size;
+%0A    private Node child;
 %0A%0A    pu
@@ -286,24 +286,85 @@
 (e);%0A    %7D%0A%0A
+%0A    public Node getChildOf() %7B%0A        return child;%0A    %7D%0A%0A
     /*%0A     
@@ -2290,32 +2290,353 @@
        %7D%0A    %7D%0A%0A
+    public boolean isBinary(Node%3CE%3E node) %7B%0A        boolean isBinaryTree = false;%0A%0A        List%3CNode%3E child = getChildOf().getChilden();%0A%0A        for (Node node1 : child) %7B%0A            if (node1.getChilden().size() %3E 2) %7B%0A                isBinaryTree = true;%0A            %7D%0A        %7D%0A%0A        return isBinaryTree;%0A    %7D%0A%0A%0A
     @Override%0A  

Update Реализовать собственную структуру данных - справочник.[#27853]