class Node:
def __init__(self, data):
self.value = data
self.smaller = None
self.larger = None
def __str__(self):
return str(self.value)
class BinTree:
def __init__(self,lst=[]):
self.root = None
for x in lst:
self.insert(x)
def insert(self,data):
the_node = Node(data)
if self.root is None:
self.root = the_node
else:
current = self.root
while True:
if the_node.value <= current.value:
if current.smaller is None:
current.smaller = the_node
return
else:
current = current.smaller
else:
if current.larger is None:
current.larger = the_node
return
else:
current = current.larger
def has(self,data):
current = self.root
while True:
if current is None:
return False
if data == current.value:
return True
if data <= current.value:
current = current.smaller
else:
current = current.larger
def get_ordered_list(self):
# yes, we can create a helper-function inside a method and then use it
def build_list(current,answer):
if current.smaller: # this is the same as "if current.smaller != None" or "if current.smaller is not None"
build_list(current.smaller,answer)
answer.append(current.value)
if current.larger:
build_list(current.larger,answer)
if self.root is None:
return []
answer = []
build_list(self.root,answer)
return answer
def clear(self):
def clear_subtree(subtree):
# walk the list, and from the bottom up, set all nodes' smaller and larger pointers to None
if subtree.smaller:
clear_subtree(subtree.smaller)
subtree.smaller = None
if subtree.larger:
clear_subtree(subtree.larger)
subtree.larger = None
if self.root:
clear_subtree(self.root)
self.root = None
a = BinTree([1,3,2])
print (a.get_ordered_list())
a.insert(2.5)
a.insert(5)
print (a.get_ordered_list())
print (5,a.has(5))
print (1.5,a.has(1.5))
a.clear()
print (a.get_ordered_list())