Как научиться решать задачи по программированию?
Практиковаться, читать умные книжки по алгоритмам и структурам данных. Вот берите например https://leetcode.com/ отсортируйте по сложности (с самых легких), и делайте-делайте. Но без теории алгоритмов будут костыли, поэтому лучше почитать что-то.
Для того чтобы решить задачу нужно знать решения типовых задач - например чтобы сформировать дерево нужно применить рекурсию по связи родитель-дочерний. Входные данные это двумерный массиив 1 измерение это элементы, 2 измерения это свойства элементов. Выборка происходит по свойствам элемента. На каждую выборку 1 элемента происходит новый поиск элементов - рекурсия.
Таким образом решение задачи сводится к ее классификации и применении типового шаблона решения на конкретную задачу. Типовые шаблоны решений это и есть алгоритмы. 
Знаешь все алгоритмы - умеешь решать все задачи.
Если задача большая - то она делится на подзадачи.