Пример #1
0
def generate_tree_postorder(node_lst, root_index):
    """ Return the root of the Huffman tree corresponding
    to node_lst[root_index].

    The function assumes that the list represents a tree in postorder.

    @param list[ReadNode] node_lst: a list of ReadNode objects
    @param int root_index: index in the node list
    @rtype: HuffmanNode

    >>> lst = [ReadNode(0, 5, 0, 7), ReadNode(0, 10, 0, 12), \
ReadNode(1, 0, 1, 0)]
    >>> generate_tree_postorder(lst, 2)
    HuffmanNode(None, HuffmanNode(None, HuffmanNode(5, None, None), \
HuffmanNode(7, None, None)), \
HuffmanNode(None, HuffmanNode(10, None, None), HuffmanNode(12, None, None)))
    >>> lst = [ReadNode(0, 70, 0, 93), ReadNode(0, 91, 0, 69), \
ReadNode(0, 76, 0, 73), ReadNode(1, 1, 1, 2), ReadNode(1, 0, 1, 3)]
    >>> generate_tree_postorder(lst, 4)
    HuffmanNode(None, HuffmanNode(None, HuffmanNode(70, None, None), \
HuffmanNode(93, None, None)), HuffmanNode(None, HuffmanNode(None, \
HuffmanNode(91, None, None), HuffmanNode(69, None, None)), \
HuffmanNode(None, HuffmanNode(76, None, None), HuffmanNode(73, None, None))))
    """
    list_node = []
    return generate_tree(node_lst, root_index, list_node)
Пример #2
0
def bytes_to_nodes(buf):
    """ Return a list of ReadNodes corresponding to the bytes in buf.

    @param bytes buf: a bytes object
    @rtype: list[ReadNode]
    """
    lst = []
    for i in range(0, len(buf), 4):
        l_type = buf[i]
        l_data = buf[i + 1]
        r_type = buf[i + 2]
        r_data = buf[i + 3]
        lst.append(ReadNode(l_type, l_data, r_type, r_data))
    return lst
Пример #3
0
def bytes_to_nodes(buf):
    """ (bytes) -> list of ReadNode

    Return a list of ReadNodes corresponding to the bytes in buf.

    >>> bytes_to_nodes(bytes([0, 1, 0, 2]))
    [ReadNode(0, 1, 0, 2)]
    """
    lst = []
    for i in range(0, len(buf), 4):
        l_type = buf[i]
        l_data = buf[i + 1]
        r_type = buf[i + 2]
        r_data = buf[i + 3]
        lst.append(ReadNode(l_type, l_data, r_type, r_data))
    return lst
Пример #4
0
def generate_tree_postorder(node_lst, root_index):
    """ Return the root of the Huffman tree corresponding
    to node_lst[root_index].
    The function assumes that the list represents a tree in postorder.
    @param list[ReadNode] node_lst: a list of ReadNode objects
    @param int root_index: index in the node list
    @rtype: HuffmanNode
    >>> lst = [ReadNode(0, 5, 0, 7), ReadNode(0, 10, 0, 12), \
ReadNode(1, 0, 1, 0)]
    >>> generate_tree_postorder(lst, 2)
    HuffmanNode(None, HuffmanNode(None, HuffmanNode(5, None, None), \
HuffmanNode(7, None, None)), \
HuffmanNode(None, HuffmanNode(10, None, None), HuffmanNode(12, None, None)))
    """

    tree = None
    nodes = []
    index = 0

    for item in node_lst:
        node = HuffmanNode(None)

        # Creates left node
        if item.l_type == 0:
            node.left = HuffmanNode(item.l_data)
        else:
            node.left = nodes.pop(0)

        # Creates right node
        if item.r_type == 0:
            node.right = HuffmanNode(item.r_data)
        else:
            node.right = nodes.pop(0)

        nodes.append(node)

        if index == root_index:
            tree = node

        index += 1
    return tree
Пример #5
0
def generate_tree(node_lst_, root_index_, list_node):
    """ helper for generate_tree_postorder to reconstruct tree

    @param list node_lst_:
    @param int root_index_:
    @param list list_node:
    @rtype: HuffmanNode

    >>> lst = [ReadNode(0, 70, 0, 93), ReadNode(0, 91, 0, 69), \
ReadNode(0, 76, 0, 73), ReadNode(1, 1, 1, 2), ReadNode(1, 0, 1, 3)]
    >>> list_node = []
    >>> generate_tree(lst, 4, list_node)
    HuffmanNode(None, HuffmanNode(None, HuffmanNode(70, None, None), \
HuffmanNode(93, None, None)), HuffmanNode(None, HuffmanNode(None, \
HuffmanNode(91, None, None), HuffmanNode(69, None, None)), \
HuffmanNode(None, HuffmanNode(76, None, None), HuffmanNode(73, None, None))))
    """
    if len(node_lst_) > 0:
        current_node = node_lst_[0]
        if current_node.l_type == 0 and current_node.r_type == 0:
            new_hfnode = HuffmanNode(None, HuffmanNode(current_node.l_data),
                                     HuffmanNode(current_node.r_data))
            list_node.append(new_hfnode)
        elif current_node.l_type == 1 and current_node.r_type == 0:
            new_hfnode = HuffmanNode(None, list_node[-1],
                                     HuffmanNode(current_node.r_data))
            list_node.pop(-1)
            list_node.append(new_hfnode)
        elif current_node.l_type == 0 and current_node.r_type == 1:
            new_hfnode = HuffmanNode(None, HuffmanNode(current_node.l_data),
                                     list_node[-1])
            list_node.pop(-1)
            list_node.append(new_hfnode)
        elif current_node.l_type == 1 and current_node.r_type == 1:
            new_hfnode = HuffmanNode(None, list_node[-2], list_node[-1])
            list_node.pop(-2)
            list_node.pop(-1)
            list_node.append(new_hfnode)
        node_lst_.pop(0)
        generate_tree(node_lst_, root_index_, list_node)
        return list_node[0]
"""