51 lines
1.6 KiB
Python
51 lines
1.6 KiB
Python
from typing import List, Type, Union
|
|
|
|
from bigtree.node.binarynode import BinaryNode
|
|
|
|
|
|
def list_to_binarytree(
|
|
heapq_list: List[Union[int, float]], node_type: Type[BinaryNode] = BinaryNode
|
|
) -> BinaryNode:
|
|
"""Construct tree from list of numbers (int or float) in heapq format.
|
|
|
|
>>> from bigtree import list_to_binarytree, print_tree, tree_to_dot
|
|
>>> nums_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
>>> root = list_to_binarytree(nums_list)
|
|
>>> print_tree(root)
|
|
1
|
|
├── 2
|
|
│ ├── 4
|
|
│ │ ├── 8
|
|
│ │ └── 9
|
|
│ └── 5
|
|
│ └── 10
|
|
└── 3
|
|
├── 6
|
|
└── 7
|
|
>>> graph = tree_to_dot(root, node_colour="gold")
|
|
>>> graph.write_png("assets/binarytree.png")
|
|
|
|
.. image:: https://github.com/kayjan/bigtree/raw/master/assets/binarytree.png
|
|
|
|
Args:
|
|
heapq_list (List[Union[int, float]]): list containing integer node names, ordered in heapq fashion
|
|
node_type (Type[BinaryNode]): node type of tree to be created, defaults to BinaryNode
|
|
|
|
Returns:
|
|
(BinaryNode)
|
|
"""
|
|
if not len(heapq_list):
|
|
raise ValueError("Input list does not contain any data, check `heapq_list`")
|
|
|
|
root = node_type(heapq_list[0])
|
|
node_list = [root]
|
|
for idx, num in enumerate(heapq_list):
|
|
if idx:
|
|
if idx % 2:
|
|
parent_idx = int((idx - 1) / 2)
|
|
else:
|
|
parent_idx = int((idx - 2) / 2)
|
|
node = node_type(num, parent=node_list[parent_idx])
|
|
node_list.append(node)
|
|
return root
|