Tree traversal into List
You're creating a new List&lt;int&gt; for every node in the tree, which is a lot of garbage for the garbage collector. Each value will also end up getting appended to many temporary lists.

Let's kick the can down the road and assume that the work of creating the list has been taken care of for us. We take the result list as a parameter and append to that

private static void ConvertTreeToList(TreeNode root, List&lt;int&gt; result)
{
    if (root == null)
    {
        return;
    }

    result.Add(root.Index);
    ConvertTreeToList(root.Left, result);
    ConvertTreeToList(root.Right, result);
}


Now we just add a helper function

private static List&lt;int&gt; ConvertTreeToList(TreeNode root)
{
    var result = new List&lt;int&gt;();
    ConvertTreeToList(root, result);
    return result;
}