fully recursive balance()