input: Write a function to perform in-order traversal on a binary search tree.
  assert inorder_traversal(TreeNode(10).add_child(5).add_child(15).add_child(2)) == [2, 5, 10, 15]
  assert inorder_traversal(TreeNode(20).add_child(10).add_child(30).add_child(5).add_child(15).add_child(25).add_child(35)) == [5, 10, 15, 20, 25, 30, 35]
  assert inorder_traversal(TreeNode(7).add_child(3).add_child(9).add_child(2).add_child(5).add_child(8).add_child(10)) == [2, 3, 5, 7, 8, 9, 10]
output: class TreeNode:
      def __init__(self, value):
          self.value = value
          self.left = None
          self.right = None
  
      def add_child(self, value):
          if value < self.value:
              if self.left is None:
                  self.left = TreeNode(value)
              else:
                  self.left.add_child(value)
          else:
              if self.right is None:
                  self.right = TreeNode(value)
              else:
                  self.right.add_child(value)
          return self
  
  def inorder_traversal(root):
      def traverse(node):
          if node is not None:
              yield from traverse(node.left)
              yield node.value
              yield from traverse(node.right)
      
      return list(traverse(root))