overfitting of regression tree from the beginning
Complexity Parameter CP describes a threshold $T$. If branch provides improvement less than $T$ it is deleted from the tree. You are using cp=0 so you told the algorithm to DO NOT prune any branches independly on their results! CP tested by printcp are very small also.

The bigger value of CP is, the more branches would be pruned so your tree should be smaller and should generalize better. Therefore you can try with highers values of CP at start and then print cross-validation results for getting suggested CP value and finally use prune method to reduce your tree for example:

model_pruned &lt;- prune(rpart_model, cp=0.01)


You can compare your trees' structures using rpart.plot(tree_object) method. I think the original tree is way too complex and that is why it overfitts at start.