Расшифровать дерево из файла

Помогите создать дерево используя 2 массива типа LinkedList treeShape, LinkedList treeLeaves. Вот пример дерева и его записи Последовательность битов описывает структуру узлов в порядке как при прямом обходе дерева. Если лист - это 0, иначе 1. Листья - в порядке как они встречаются при обходе дерева по порядку. Из этого всего надо собрать дерево, а потом это дерево использовать для расшифровки по Хаффману.

    private HashMap<Byte, Node> createHuffmanTree(HashMap<Byte, Integer> uniqueSequences) {
        HashMap<Byte, Node> codingTable = new HashMap<>();
        PriorityQueue<Node> tree = new PriorityQueue<>();

        //I am creating leaves that only store characters.
        for (Map.Entry<Byte, Integer> entry : uniqueSequences.entrySet()) {
            Node leaf = new Node(entry.getValue(), entry.getKey());
            codingTable.put(entry.getKey(), leaf);
            tree.add(leaf);
        }

        //I iterate over all the trees until there is only 1 left.
        while (tree.size() > 1) {
            Node first = tree.poll();
            Node second = tree.poll();
            tree.add(new Tree(first, Objects.requireNonNull(second)));
        }

        //I create binary sequences (path) for each character in the tree.
        Node root = tree.poll();
        if (codingTable.size() == 1) {
            Objects.requireNonNull(root).createBitSequence("0");
        } else {
            Objects.requireNonNull(root).createBitSequence("");
        }

        return codingTable;
    }

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


Ответы (1 шт):

Автор решения: Michael Tsurkan

В общем реализовал с помощью стека, а хотел неявной рекурсией в дереве...

public EncodingTreeNode unflattenTree(LinkedList<Boolean> treeShape, LinkedList<Byte> treeLeaves) {
    Stack<EncodingTreeNode> stack = new Stack<>();
    EncodingTreeNode parent = new EncodingTreeNode();
    stack.push(parent);
    for (int i = 1; i < treeShape.size(); i++) {
        EncodingTreeNode previousNode = stack.peek();
        if (treeShape.get(i)) {
            if (previousNode.leftNode == null) {
                previousNode.leftNode = new EncodingTreeNode();
                stack.push(previousNode.leftNode);
            } else if (previousNode.rightNode == null) {
                previousNode.rightNode = new EncodingTreeNode();
                stack.pop();
                stack.push(previousNode.rightNode);
            }
        } else {
            if (previousNode.leftNode == null) {
                previousNode.leftNode = new EncodingTreeNode(treeLeaves.pollFirst());
            } else if (previousNode.rightNode == null) {
                previousNode.rightNode = new EncodingTreeNode(treeLeaves.pollFirst());
                stack.pop();
            }
        }
    }
    return parent;
}
→ Ссылка