In [19]:
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
In [23]:
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())
[1, 2, 3]
[1, 2, 2.5, 3, 5]
5 True
1.5 False
[]