Проблема в том, где вы их определяете:
T leftChild = default(T);
T rightChild = default(T);
Вы передаете ссылку на эти объекты, и они уничтожаются сразу после завершения метода, потому что они являются локальными переменными.
Попробуйте отправить объекты напрямую.
private void traversePostOrder(Modify operation, int parentIndex) {
if (parentIndex < size) {
int leftChildIndex = getLeftChildIndex(parentIndex);
int rightChildIndex = getRightChildIndex(parentIndex);
T parent = container[parentIndex];
bool leftChildModified = false;
bool rightChildModified = false;
Library.Diagnostics.Message.logMessage("P: " + parent, 2);
if (leftChildIndex < container.Length) {
traversePostOrder(operation, leftChildIndex);
leftChildModified = true;
}
if (rightChildIndex < container.Length) {
traversePostOrder(operation, rightChildIndex);
rightChildModified = true;
}
if(leftChildModified && rightChildModified)
{
operation(ref container[parentIndex], ref container[leftChildIndex], ref container[rightChildIndex]);
}
else if(leftChildModified)
{
operation(ref container[parentIndex], ref container[leftChildIndex], ref Default(T));
}
else if(rightChildModified)
{
operation(ref container[parentIndex], ref Default(T), ref container[rightChildIndex]);
}
else
{
operation(ref container[parentIndex], ref default(T), ref default(T));
}
}
}