summaryrefslogtreecommitdiff
path: root/collect
diff options
context:
space:
mode:
Diffstat (limited to 'collect')
-rw-r--r--collect/bst.py54
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