Първо. И най-най-сериозно. Научи се да пишеш на български. Пълен член се поставя когато обектът върши действието. Изключенията са твърде малко, за да ги описвам. Освен това, научи се да пишеш "двоично дърво". Сериозно, занимаваш се с това повече от пет години и не знаеш, че в името няма и-кратко? Конструктор не се пише с две у-та.
Всяко изречение. Във всяко шибано изречение имаше правописна грешка…
ОК, успокоих се. Следва не-ядосано описание на нещата, които ми се сториха грешни.
Нямаше коментари. Където беше сложено нещо, беше на един ред (//), а и беше на английски.
Всеки софтуер трябва да има коментари. Всеки клас, всеки метод трябва да има коментари. Няма изключения.
Освен това, в програми за обучение трябва да има дори повече коментари от обиковено. Даже и да е очевидно за какво става въпрос - винаги има някой неразбрал, винаги има нужда от още.
Не използваш оператора « за печатане на листата. Твоят аргумент против рекурсивно триещ деструктор беше, че твърде силно връзва единия клас с другия - ако деструкторът на TreeNode е рекурсивен, то структурата не би могла да се използва за триене на един връх, само на цяло дърво - нали? В такъв случай, не би ли трябвало ти да сложиш оператор « в _traverse? Защото иначе пък връзваш наобратно класа за листото с класа за дървото. Защо приемаш, че данните, които ти трябват с в data полето?
Сложих Enum за видовете обхождане на дърво ( if(type == PREORDER) е по-информативно от if(when == 0)) и още малко дребни неща. Кръстих променливите еднакво навсякъде(на някои места беше srch, на други val). Не съм променял същинския код на програмата. Но, честно казано, искаше ми се. Което ме довежда до…
Проблемът
Това не е обектно-ориентирана реализация. Да, знам, веднага ще ми скочиш, че имало методи, енкапсулация и т.н. И пак не е ООП. Вгледай се малко по-внимателно. Това не е нищо повече от C++ wrapper за C код. Реално всеки един от методите ти всъщност вика една функция, която би се компилирала на C. Функция, която приема TreeNode *& (т.е. в момента е в класа, но със същия успех можеше да е и извън него). Това ако не е процедурно програмиране, не знам кое е. Включително и деструкторът ти е такъв.
Намирам няколко обяснения за ситуацията:
- Ти толкова можеш
- C++ просто не е подходящо за реализация на дървета.
- ООП просто не е подходящо за реализация на дървета.
Кое от тези е?
Ако на C++ става грозно, просто да го напишем на C? Ако не, да коригираме текущия код.