Are you studying binary trees for your next exam, assignment or technical interview?
Binarytree is a Python library which provides a simple API to generate, visualize, inspect and manipulate binary trees. It allows you to skip the tedious work of setting up test data, and dive straight into practising your algorithms. Heaps and BSTs (binary search trees) are also supported.
- Python 2.7, 3.4, 3.5 or 3.6.
To install a stable version from PyPi:
~$ pip install binarytreeTo install the latest version directly from GitHub:
~$ pip install -e [email protected]:joowani/binarytree.git@master#egg=binarytreeYou may need to use sudo depending on your environment.
By default, binarytree uses the following class to represent a node:
classNode(object): def__init__(self, value, left=None, right=None): self.value=value# The node valueself.left=left# Left childself.right=right# Right childGenerate and pretty-print various types of binary trees:
>>>frombinarytreeimporttree, bst, heap>>>>>># Generate a random binary tree and return its root node>>>my_tree=tree(height=3, is_perfect=False) >>>>>># Generate a random BST and return its root node>>>my_bst=bst(height=3, is_perfect=True) >>>>>># Generate a random max heap and return its root node>>>my_heap=heap(height=3, is_max=True, is_perfect=False) >>>>>># Pretty-print the trees in stdout>>>print(my_tree) ## _______1_____# / \# 4__ ___3# / \ / \# 0 9 13 14# / \ \# 7 10 2#>>>print(my_bst) ## ______7_______# / \# __3__ ___11___# / \ / \# 1 5 9 _13# / \ / \ / \ / \# 0 2 4 6 8 10 12 14#>>>print(my_heap) ## _____14__# / \# ____13__ 9# / \ / \# 12 7 3 8# / \ /# 0 10 6#Use the binarytree.Node class to build your own trees:
>>>frombinarytreeimportNode>>>>>>root=Node(1) >>>root.left=Node(2) >>>root.right=Node(3) >>>root.left.right=Node(4) >>>>>>print(root) ## __1# / \# 2 3# \# 4#Inspect tree properties:
>>>frombinarytreeimportNode>>>>>>root=Node(1) >>>root.left=Node(2) >>>root.right=Node(3) >>>root.left.left=Node(4) >>>root.left.right=Node(5) >>>>>>print(root) ## __1# / \# 2 3# / \# 4 5#>>>root.height2>>>root.is_balancedTrue>>>root.is_bstFalse>>>root.is_completeTrue>>>root.is_max_heapFalse>>>root.is_min_heapTrue>>>root.is_perfectFalse>>>root.is_strictTrue>>>root.leaf_count3>>>root.max_leaf_depth2>>>root.max_node_value5>>>root.min_leaf_depth1>>>root.min_node_value1>>>root.size5>>>root.properties# To see all at once:{'height': 2, 'is_balanced': True, 'is_bst': False, 'is_complete': True, 'is_max_heap': False, 'is_min_heap': True, 'is_perfect': False, 'is_strict': True, 'leaf_count': 3, 'max_leaf_depth': 2, 'max_node_value': 5, 'min_leaf_depth': 1, 'min_node_value': 1, 'size': 5} >>>root.leaves [Node(3), Node(4), Node(5)] >>>root.levels [[Node(1)], [Node(2), Node(3)], [Node(4), Node(5)]]Use level-order (breadth-first) indexes to manipulate nodes:
>>>frombinarytreeimportNode>>>>>>root=Node(1) # index: 0, value: 1>>>root.left=Node(2) # index: 1, value: 2>>>root.right=Node(3) # index: 2, value: 3>>>root.left.right=Node(4) # index: 4, value: 4>>>root.left.right.left=Node(5) # index: 9, value: 5>>>>>>print(root) ## ____1# / \# 2__ 3# \# 4# /# 5#>>># Use binarytree.Node.pprint instead of print to display indexes>>>root.pprint(index=True) ## _________0-1_# / \# 1-2_____ 2-3# \# _4-4# /# 9-5#>>># Return the node/subtree at index 9>>>root[9] Node(5) >>># Replace the node/subtree at index 4>>>root[4] =Node(6, left=Node(7), right=Node(8)) >>>root.pprint(index=True) ## ______________0-1_# / \# 1-2_____ 2-3# \# _4-6_# / \# 9-7 10-8#>>># Delete the node/subtree at index 1>>>delroot[1] >>>root.pprint(index=True) ## 0-1_# \# 2-3Traverse the trees using different algorithms:
>>>frombinarytreeimportNode>>>>>>root=Node(1) >>>root.left=Node(2) >>>root.right=Node(3) >>>root.left.left=Node(4) >>>root.left.right=Node(5) >>>>>>print(root) ## __1# / \# 2 3# / \# 4 5#>>>root.inorder [Node(4), Node(2), Node(5), Node(1), Node(3)] >>>root.preorder [Node(1), Node(2), Node(4), Node(5), Node(3)] >>>root.postorder [Node(4), Node(5), Node(2), Node(3), Node(1)] >>>root.levelorder [Node(1), Node(2), Node(3), Node(4), Node(5)] >>>list(root) # Equivalent to root.levelorder [Node(1), Node(2), Node(3), Node(4), Node(5)]List representations are also supported:
>>>frombinarytreeimportbuild>>>>>># Build a tree from list representation>>>values= [7, 3, 2, 6, 9, None, 1, 5, 8] >>>root=build(values) >>>print(root) ## __7# / \# __3 2# / \ \# 6 9 1# / \# 5 8#>>># Convert the tree back to list representation>>>root.values [7, 3, 2, 6, 9, None, 1, 5, 8]Check out the documentation for more details!
Please have a look at this page before submitting a pull request. Thanks!
