Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

plamen_vihren avatar plamen_vihren 2 Точки

09. C++ OOP Pure Virtual Members and Multiple Inheritance (Task 4 Tree)

Zdravejte,

Molq da byda prosten za tova che pisha na latinica - no tuk sym s 10 prysta.

Reshenieto mi e 10713780, account plamen_vihren.

Qsno mi e che traverse algorithm moje da byde ot vida:

void print (TreeNode* node){

 if (node!=nullptr){

 cout<<node->data<<endl;

print(node->left);

print (node->right);

}

}

Tozi algorithm e za binarno dyrvo, no samo s edin call se prepravq za tozi sluchaj.

Problemcheto mi e slednoto vyv funkciqta getTreeView(rootObject) Vie vryshtate samo ROOT nodovete, za da prodylja obache na men mi trqbva vidimost ot gore no dolu, a chrez Parent, e realizirana vidimost ot dolu na gore. Kak da slezna pone edno nivo na dolu, kato v posochenata funkciq dostyp do cqlata baza nqmam. Ako ima dostyp do vsichki elementi e lesno vzimash obekta i dokato ne e null pointer se razhojdash na gore kym parenta.

Kak s kakyv mehanism da slezna pone edno nivo na dolu????????????????

 

S uvajenie Plamen Nikolaev 

Blagodarq predvaritelno na vseki kojto proqvi dobra volq da obyrne vnimanie na moeto pitane ,

Тагове:
0
C++ Advanced
j.petrov_90 avatar j.petrov_90 373 Точки

Привет, Пламен,

Правилно разсъждаваш. Да започна с това.
Добавям само, че в задачата не става въпрос за бинарно дърво, а за К-дърво (т.е. един parent може да има повече от 2 child-а).
На компютъра като си направиш папка вътре можеш да имаш повече от 2 файла, нали?
Ти си го споменал, разбира се ... просто пояснявам.

Грешиш, обаче, че в задачата не ви е даден механизъм да се "ходи" надолу по дървото.
Абстрахирам се за момент от задачата за ти обясня как работи едно принципно обхождане на файлова структура(дърво)

Малко pseudo-code:
fun traverseTree(tree){
  while(tree = tree->next){
    //skip parent node
    if(tree == parent(tree)) continue;

    //skip current directory file - otherwise an endless loop will occur
    if(tree == currentDir) continue;

    //found file is a directory -> traverse it
    if(isDirectory(tree)) traverseTree(tree) ;
   
    //found normal file (not a directory)
    processFile(tree);
  }
}

Обикновенно като работим с дървета (в случая файлова система) - работим с рекурсия!

С две думи:
- Всичко в една файлова система е представено като файлове;
- Папките пак са файлове;
- Папките са маркирани със специален флаг, за да се знае, че освен файлове - те са и папки.
- Всяка папка освен списък със своите файлове - си има е parent node (освен истинския root - той пак си има parent node де, просто е nullptr).

Сега дай да се върнем към задачата.
Всяка папка трябва да ти е маркирана като "файл" и като "папка".
Как? С помощта на Interface-ите, които са ви предоставени в скелета.

Как да слезем надолу по дървото?
Ами root-а ни е папка. Всяка папка може да вземе своите файлове.
В задачата имате дадени 2 interface-ни функции за iterator-и begin() и end() на папката.
От begin() и end() итератори се сещам поне за няколко начина как да си вземеш елементите :)
Зависи вече каква структура си избрал да ползваш.

Малко жокери можеш до ползваш и темата на колегата за същата задача:
https://softuni.bg/forum/26191/cplusplus-advanced-04-tree-gettreeview-funkciyata

Само внимавай, че теб те пренасочвам натам, а него го пренасочвам на тук. Да не стане някоя безкрайна рекурсия и да гръмне със stack overflow :)

Поздрави

0
24/03/2019 19:00:09
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.