input: Write a function to find the maximum depth of a binary tree.
  assert max_depth(tree) == 4
  tree2 = BinaryTree()
  data_list2 = [10, 5, 15, 3, 7, 12, 18, 1]
  for data in data_list2:
   tree2.insert(data)
  assert max_depth(tree2) == 4
  tree3 = BinaryTree()
  data_list3 = [1]
  for data in data_list3:
   tree3.insert(data)
  assert max_depth(tree3) == 1
output: class TreeNode:
      def __init__(self, value=0, left=None, right=None):
          self.value = value
          self.left = left
          self.right = right
  
  class BinaryTree:
      def __init__(self):
          self.root = None
  
      def insert(self, value):
          if self.root is None:
              self.root = TreeNode(value)
          else:
              self._insert_recursive(self.root, value)
  
      def _insert_recursive(self, node, value):
          if value < node.value:
              if node.left is None:
                  node.left = TreeNode(value)
              else:
                  self._insert_recursive(node.left, value)
          else:
              if node.right is None:
                  node.right = TreeNode(value)
              else:
                  self._insert_recursive(node.right, value)
  
  def max_depth(tree):
      def _max_depth(node):
          if node is None:
              return 0
          left_depth = _max_depth(node.left)
          right_depth = _max_depth(node.right)
          return max(left_depth, right_depth) + 1
  
      return _max_depth(tree.root)
  
  tree = BinaryTree()
  data_list = [3, 9, 20, None, None, 15, 7]
  for data in data_list:
      if data is not None:
          tree.insert(data)
  
  assert max_depth(tree) == 4
  tree2 = BinaryTree()
  data_list2 = [10, 5, 15, 3, 7, 12, 18, 1]
  for data in data_list2:
      tree2.insert(data)
  assert max_depth(tree2) == 4
  tree3 = BinaryTree()
  data_list3 = [1]
  for data in data_list3:
      tree3.insert(data)
  assert max_depth(tree3) == 1