def rotate_right(self, old_root: BinaryTreeNode):
        new_root = old_root.left

        # 1.change upper relationships.
        if old_root.is_root():
            self.set_root(new_root)
        else:
            old_root.parent.set_child(new_root)

        # 2.change old_root's left
        old_root.set_left(new_root.right)
        # 3.change new root's right
        new_root.set_right(old_root)

        # 4.update color
        new_root.color = old_root.color
        old_root.color = RED

        # 5.update size
        old_root.update_size()
        new_root.update_size()

        return new_root
 def flip_colors(self, node: BinaryTreeNode):
     if self.is_red(node.left) and self.is_red(node.right):
         node.left.color = BLACK
         node.right.color = BLACK
         if not node.is_root():
             node.color = RED