code: def re_balance(self):
          
          self.update_heights(recursive=False)
          self.update_balances(False)
  
          while self.balance < -1 or self.balance > 1:
              if self.balance > 1:
                  if self.node.left.balance < 0:
                      self.node.left.rotate_left()
                      self.update_heights()
                      self.update_balances()
                  self.rotate_right()
                  self.update_heights()
                  self.update_balances()
  
              if self.balance < -1:
                  if self.node.right.balance > 0:
                      self.node.right.rotate_right()
                      self.update_heights()
                      self.update_balances()
                  self.rotate_left()
                  self.update_heights()
                  self.update_balances()
docs: Re balance tree. After inserting or deleting a node,