code: def prune(self):
          
          if not self[0] or not self[1]:    # if I have an empty branch
              direction = not self[0]       # graft the other branch here
              #if trace:
              #    print('Grafting {} branch'.format(
              #       'right' if direction else 'left'))
  
              result = self[direction]
              #if result: result.verify()
              return result
          else:
              # Replace the root node with the greatest predecessor.
              heir, self[0] = self[0].pop_greatest_child()
              #if trace:
              #    print('Replacing {} with {}.'.format(
              #        self.x_center, heir.x_center
              #        ))
              #    print('Removed greatest predecessor:')
              #    self.print_structure()
  
              #if self[0]: self[0].verify()
              #if self[1]: self[1].verify()
  
              # Set up the heir as the new root node
              (heir[0], heir[1]) = (self[0], self[1])
              #if trace: print('Setting up the heir:')
              #if trace: heir.print_structure()
  
              # popping the predecessor may have unbalanced this node;
              # fix it
              heir.refresh_balance()
              heir = heir.rotate()
              #heir.verify()
              #if trace: print('Rotated the heir:')
              #if trace: heir.print_structure()
              return heir
docs: On a subtree where the root node's s_center is empty,
          return a new subtree with no empty s_centers.