Node* temp = node->right.get();
temp является необработанным указателем на правый узел узла
node->right.reset(temp->left.get());
правый узел узла сбрасывается на левый узел temp, таким образом, правый узел исходного узла (к которому идут временные точки) получаетудален.Это означает, что временный необработанный указатель теперь указывает на удаленный узел.
temp->left.reset(node); // **Here is segmentation fault happens**
Поскольку temp удаляется, разыменование его, чтобы получить левый узел, приводит к плохим вещам.
Быстрое решениеМожет быть, использовать release () вместо get () на первом месте, чтобы взять на себя ответственность за правый узел узла?