Подходит ли C# для структур данных и алгоритмов?
Да. Код на нём читается почти как на Java: типы делают явными каждый узел, каждую ссылку и каждый обобщённый параметр, а System.Collections.Generic покрывает большинство структур этого пути. Две привычки стоит выработать пораньше. LINQ лаконичен, но каждый OrderBy означает сортировку, а каждый Where означает цикл, так что он скрывает те затраты, которые вы учитесь считать; а Array.Sort сортирует неустойчиво, что важно всякий раз, когда равные ключи должны сохранять свой порядок.
Какие коллекции .NET каким структурам данных соответствуют?
List<T> устроен как динамический массив, Stack<T> и Queue<T> построены на массивах, LinkedList<T> представляет собой двусвязный список, Dictionary<TKey,TValue> и HashSet<T> построены на хеш-таблицах, а SortedDictionary<TKey,TValue> и SortedSet<T> устроены как красно-чёрные деревья, сбалансированные, как АВЛ-дерево, которое вы пишете на втором шаге. SortedList<TKey,TValue> представляет собой пару массивов, упорядоченных по ключу, а начиная с .NET 6 есть PriorityQueue<TElement,TPriority>, min-куча на основе массива. Класса для префиксного дерева или графа нет: их вы пишете сами.
Узел дерева или списка в C# должен быть классом или структурой?
Классом. struct является типом значения: он вообще не может содержать поле собственного типа, а там, где его копируют, изменение копии не затрагивает оригинал. Класс является ссылочным типом, поэтому узлы могут указывать друг на друга так, как это нужно связному списку или дереву. Структуры оставьте для небольших значений, например для координаты клетки на сетке или взвешенного ребра.
Есть ли в C# очередь с приоритетом?
Начиная с .NET 6 да: PriorityQueue<TElement,TPriority>, min-куча на основе массива, в которую каждый элемент добавляется со своим приоритетом; чтобы получить max-кучу, передайте IComparer<TPriority>, который меняет порядок на обратный. В .NET Framework и более старых средах выполнения её нет, поэтому разработчики на C# долго писали собственную кучу или приспосабливали под неё SortedSet<T>, и поэтому умение написать кучу по-прежнему важно. На этом пути вы делаете это на втором шаге.
Какие курсы этого пути не преподаются на C#?
Три: динамическое программирование и серия по интервью на Python преподаются на Python, а битовые операции на C++. Они перечислены после шагов, каждый со ссылкой, которая открывает курс на его собственном языке. Таблица мемоизации в C# представляет собой массив или Dictionary, а битовые трюки переносятся без потерь, вплоть до различия, которое проводит C++: >> сохраняет знак у int и заполняет нулями у uint.
Нужно ли знать C#, прежде чем начинать этот путь?
Как минимум классы, методы, массивы, циклы и обобщённые коллекции вроде List<T>. Если это для вас новое, курс C# от Coddy сначала бесплатно доведёт вас до этого уровня, а этот путь начинается там, где он заканчивается.