Как лучше построить дерево с городами в Yii2?
Использую для этого нативные связи в фреймворке.$city = City::findOne( ... );
$city->region->country
или в обратную сторону$country = Country::findOne( ... );
foreach( $country->regions as $region ) {
    foreach ( $region->cities as $city ) {
        echo $city->name
    }
}
Не забывать о жадной загрузке with() и кэширование через Yii::$app->db->cache( function () {} ) с использованием зависимостей.
Добавлено:
1. Почитайте о связях: www.yiiframework.com/doc-2.0/guide-db-active-recor...
2. Почитайте о жадной и ленивой загрузке: www.yiiframework.com/doc-2.0/guide-db-active-recor...
3. Почитайте о кэшировании результатов запросов: www.yiiframework.com/doc-2.0/guide-caching-data.ht...
4. Почитайте о зависимостях: www.yiiframework.com/doc-2.0/guide-caching-data.ht...
Подключите кэш, ну и подумайте над логикой