@@ -156,18 +156,65 @@ template<typename T> typename btree<T>::iterator btree<T>::find(const T& elem) {
156156 if (elem == result.first->getVal(result.second)) {
157157 return iterator(result.first, result.second);
158158 }
159- return iterator(tail_, tail_->getSize()-1 );
159+ return this->end( );
160160}
161161
162162template<typename T> std::pair<typename btree<T>::Node*, size_t> btree<T>::findHelper(Node* node, const T& elem) {
163163 for (size_t i = 0; i < node->getSize(); ++i) {
164- if (elem == node->getVal(i)) {
165- return make_pair(node, i);
166- } else if (elem > node->getVal(i)) {
167- if (node -> getChild(i+1) != nullptr) {
168- return findHelper(node->getChild(i+1).get(), elem);
164+ if (i == 0) {
165+ if (node -> getSize() == 1) {
166+ if (elem == node->getVal(0)) {
167+ return make_pair(node, 0);
168+ } else if (elem < node->getVal(0)){
169+ if (node -> getChild(0) != nullptr) {
170+ return findHelper(node->getChild(0).get(), elem);
171+ } else {
172+ return make_pair(node, 0);
173+ }
174+ } else {
175+ if (node -> getChild(1) != nullptr) {
176+ return findHelper(node->getChild(1).get(), elem);
177+ } else {
178+ return make_pair(node, 0);
179+ }
180+ }
169181 } else {
170- return make_pair(node, node->getSize() - 1);
182+ if (elem == node->getVal(0)) {
183+ return make_pair(node, 0);
184+ } else if (elem < node->getVal(0)){
185+ if (node -> getChild(0) != nullptr) {
186+ return findHelper(node->getChild(0).get(), elem);
187+ } else {
188+ return make_pair(node, 0);
189+ }
190+ }
191+ }
192+ } else if (i == node->getSize() - 1) {
193+ if (elem == node->getVal(i)) {
194+ return make_pair(node, i);
195+ } else if (elem > node -> getVal(i)){
196+ if (node -> getLast().get() != nullptr) {
197+ return findHelper(node -> getLast().get(), elem);
198+ } else {
199+ return make_pair(node, i);
200+ }
201+ } else {
202+ // std::cout << "fucl" << node->getVal(i) << std::endl;
203+ if (node -> getChild(i) != nullptr) {
204+ return findHelper(node->getChild(i).get(), elem);
205+ } else {
206+ return make_pair(node, i);
207+ }
208+ }
209+ } else {
210+ if (elem == node->getVal(i)) {
211+ return make_pair(node, i);
212+ } else if (elem < node->getVal(i)) {
213+ if (node -> getChild(i) != nullptr) {
214+ return findHelper(node->getChild(i).get(), elem);
215+ } else {
216+ return make_pair(node, i);
217+ }
171218 }
172219 }
173220 }
@@ -176,13 +223,60 @@ template<typename T> std::pair<typename btree<T>::Node*, size_t> btree<T>::findH
176223
177224template<typename T> std::pair<typename btree<T>::Node*, size_t> btree<T>::findHelper(Node* node, const T& elem) const {
178225 for (size_t i = 0; i < node->getSize(); ++i) {
179- if (elem == node->getVal(i)) {
180- return make_pair(node, i);
181- } else if (elem > node->getVal(i)) {
182- if (node -> getChild(i+1) != nullptr) {
183- return findHelper(node->getChild(i+1).get(), elem);
226+ if (i == 0) {
227+ if (node -> getSize() == 1) {
228+ if (elem == node->getVal(0)) {
229+ return make_pair(node, 0);
230+ } else if (elem < node->getVal(0)){
231+ if (node -> getChild(0) != nullptr) {
232+ return findHelper(node->getChild(0).get(), elem);
233+ } else {
234+ return make_pair(node, 0);
235+ }
236+ } else {
237+ if (node -> getChild(1) != nullptr) {
238+ return findHelper(node->getChild(1).get(), elem);
239+ } else {
240+ return make_pair(node, 0);
241+ }
242+ }
184243 } else {
185- return make_pair(node, node->getSize() - 1);
244+ if (elem == node->getVal(0)) {
245+ return make_pair(node, 0);
246+ } else if (elem < node->getVal(0)){
247+ if (node -> getChild(0) != nullptr) {
248+ return findHelper(node->getChild(0).get(), elem);
249+ } else {
250+ return make_pair(node, 0);
251+ }
252+ }
253+ }
254+ } else if (i == node->getSize() - 1) {
255+ if (elem == node->getVal(i)) {
256+ return make_pair(node, i);
257+ } else if (elem > node -> getVal(i)){
258+ if (node -> getLast().get() != nullptr) {
259+ return findHelper(node -> getLast().get(), elem);
260+ } else {
261+ return make_pair(node, i);
262+ }
263+ } else {
264+ // std::cout << "fucl" << node->getVal(i) << std::endl;
265+ if (node -> getChild(i) != nullptr) {
266+ return findHelper(node->getChild(i).get(), elem);
267+ } else {
268+ return make_pair(node, i);
269+ }
270+ }
271+ } else {
272+ if (elem == node->getVal(i)) {
273+ return make_pair(node, i);
274+ } else if (elem < node->getVal(i)) {
275+ if (node -> getChild(i) != nullptr) {
276+ return findHelper(node->getChild(i).get(), elem);
277+ } else {
278+ return make_pair(node, i);
279+ }
186280 }
187281 }
188282 }
@@ -194,7 +288,7 @@ template<typename T> typename btree<T>::const_iterator btree<T>::find(const T& e
194288 if (elem == result.first->getVal(result.second)) {
195289 return iterator(result.first, result.second);
196290 }
197- return const_iterator(tail_, tail_->getSize()-1 );
291+ return this->cend( );
198292}
199293
200294
0 commit comments