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)
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
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
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
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]
"""