function rotate_left(node): # restores balance after insertion

   new_root = node.right
   node.right = new_root.left
   new_root.left = node
   update_height(node)
   update_height(new_root)
   return new_root


 function insert_avl(node, value):
   node = insert(node, value)
   if balance_factor(node) > 1 or balance_factor(node) < -1:
      node = rebalance(node) # one or two rotations

   return node              # keeps height O(log n)
