``````

In [3]:

class Node:
def __init__(self, value=None, left=None, right=None):
self.value = value
self.left = None
self.right = None

``````

Implement a Binary Search Tree

``````

In [91]:

class BinarySearchTree:
def __init__(self, value=None):
self.root = Node(value)

def insert(self, root, value):
if root == None:
return Node(value)
if value < root.value:
if root.left == None:
root.left = self.insert(root.left, value)
else:
self.insert(root.left, value)
else:
if root.right == None:
root.right = self.insert(root.right, value)
else:
self.insert(root.right, value)

def preorder(self, root=None):
"""Root, Left, Right"""
if root == None:
root = self.root
return
print(root.value)
self.preorder(root.left)
self.preorder(root.right)

def inorder(self, root=None):
"""Left, Root, Right"""
if root == None:
root = self.root
return
self.inorder(root.left)
print(root.value)
self.inorder(root.right)

def postorder(self, root=None):
"""Left, Right, Root"""
if root == None:
root = self.root
return
self.postorder(root.left)
self.postorder(root.right)
print(root.value)

def bfs(self, root=None):
if root == None:
root = self.root
queue = []
visited = set()
print(root.value)
queue.append(root)

while len(queue) != 0:
curr = queue.pop(0)
if n == None:
return
if n not in visited:
print(n.value)
queue.append(n)

``````
``````

In [92]:

b = BinarySearchTree(100)
b.insert(b.root, 10)
b.insert(b.root, 101)
b.insert(b.root, 9)

``````
``````

In [93]:

b.preorder(b.root)

``````
``````

100
10
9
101

``````
``````

In [94]:

b.inorder(b.root)

``````
``````

9
10
100
101

``````
``````

In [95]:

b.postorder(b.root)

``````
``````

9
10
101
100

``````
``````

In [96]:

b.bfs()

``````
``````

100
10
101
9

``````
``````

In [ ]:

``````