diff options
Diffstat (limited to 'collect')
| -rw-r--r-- | collect/bst.py | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/collect/bst.py b/collect/bst.py index 8e95fa2..d3231ee 100644 --- a/collect/bst.py +++ b/collect/bst.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -from typing import Any, Optional +from typing import Any, List, Optional class Node(object): @@ -448,6 +448,58 @@ class BinaryTree(object): def height(self): return self.depth() + def repr_traverse(self, padding: str, pointer: str, node: Node, has_right_sibling: bool) -> str: + if node is not None: + self.viz += f'\n{padding}{pointer}{node.value}' + if has_right_sibling: + padding += "│ " + else: + padding += ' ' + + pointer_right = "└──" + if node.right is not None: + pointer_left = "├──" + else: + pointer_left = "└──" + + self.repr_traverse(padding, pointer_left, node.left, node.right is not None) + self.repr_traverse(padding, pointer_right, node.right, False) + + def __repr__(self): + """ + Draw the tree in ASCII. + + >>> t = BinaryTree() + >>> t.insert(50) + >>> t.insert(25) + >>> t.insert(75) + >>> t.insert(12) + >>> t.insert(33) + >>> t.insert(88) + >>> t.insert(55) + >>> t + 50 + ├──25 + │ ├──12 + │ └──33 + └──75 + ├──55 + └──88 + """ + if self.root is None: + return "" + + self.viz = f'{self.root.value}' + pointer_right = "└──" + if self.root.right is None: + pointer_left = "└──" + else: + pointer_left = "├──" + + self.repr_traverse('', pointer_left, self.root.left, self.root.left is not None) + self.repr_traverse('', pointer_right, self.root.right, False) + return self.viz + if __name__ == '__main__': import doctest |
