Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
Как мне корректно составить рекурсивную функцию которая будет заполнять дерево узлами из контейнера данных? Не могли бы вы привести пример кода? В гугле очень часто пример - когда в main вызывают в цикле функцию создания узла - это не то. Когда я создаю у меня либо только вершина дерева создается либо происходит переполнение стека, что еще печальней. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. я знаю, что функция проходить один раз - заносит в правую часть узел и выходит из функции... как мне правильно устроить рекурсию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 14:08 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
Byka, В insert_node не по всем логическим путям есть возвращаемое значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 14:48 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
pirovindos, здесь в конце? я не понимаю, как происходит заполнение дерева? Сначала корень, потом мы сравниваем пришедшее значение со значением корня, если новое меньше корня - то (если левое поддерево есть или же его создаем) на левое поддерево (tr->left) присваеваем значение (для этого рекурсивно вызываем эту же функцию) после чего получается мы уже работаем с новым узлом которое левое поддерево? Как мы тогда возращаемся к корню для того что бы заполнить правое поддерево и все входящие к нему поддеревья? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 20:31 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
Нашел алгоритм Теперь осталось написать функцию нормально ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2012, 21:10 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
Byka, Приведите вызывающий код. Откуда вызывается insert_node первый раз? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 09:16 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
Byka, На самом деле не нужна тут никакая рекурсия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 10:02 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
В смысле, можно делать и рекурсией, и циклом, но циклом правильнее, в С не оптимизируется хвостовой рекурсия, поэтому стек будет расти на глубину дерева, а это не очень правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 10:05 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
pirovindos, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 12:28 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
MasterZiv, циклом - я видел примеры, но думал что это не самый лучший вариант. Дело в том, что я хотел еще спросить, как правильно передавать переменные в рекурсивную функцию, что бы не было переполнения стека? По значению? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 12:32 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
Ага, хотя в случае, если это именно хвостовая рекурсия - то лучше применить цикл?... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 12:36 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
Товарищи, где можно почитать про рекурсию в С++? Что бы полностью разобраться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 12:55 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
Byka, 1. Где-то должна быть проверка того, что входной вектор d исчерпан. 2. Наверное, не нужно делать ins_val++ перед рекурсивным вызовом insert_node внутри insert_node. P.S. Решать такие задачи рекурсией, по-моему, нормально, если контролировать высоту дерева. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 14:15 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
BykaТоварищи, где можно почитать про рекурсию в С++? Что бы полностью разобраться. А что ты хочешь прочитать про рекурсию в С++ ? В С++ функция может вызывать саму себя рекурсивно. Вот собственно и всё про рекурсию в С++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 14:26 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
BykaMasterZiv, циклом - я видел примеры, но думал что это не самый лучший вариант. Это самый лучший вариант. Byka Дело в том, что я хотел еще спросить, как правильно передавать переменные в рекурсивную функцию, что бы не было переполнения стека? По значению? А как ни передавай, всё равно будет переполнение стека. Даже вообще ничего можно не передавать (функцию без параметров вызывать) -- и будет всё равно стек переполняться. Стек вызовов -- это стуктура с ограниченным размером, поэтому он всегда может переполнится. Оно конечно, по идее в дереве поиска высота всегда достаточно маленькая (она расчитывается как логарифм от числа объектов), но чисто теоретически алгоритмы, построенные на рекурсии, будут потенциально переполняться. На циклах -- никогда. Чисто теоретически, применительно к этой задаче, я просто не думаю, что рекурсия -- это лучший способ выражения данного алгоритма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 14:32 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
BykaАга, хотя в случае, если это именно хвостовая рекурсия - то лучше применить цикл?... Блин, ты как Моисей, правда. Я такое где-то говорил ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 14:33 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
BykaАга, хотя в случае, если это именно хвостовая рекурсия - то лучше применить цикл?... Если это хвостовая рекурсия, то потенциально алгоритм можно выполнять так, чтобы стек вызовов не рос, а оставался постоянным. Тогда всё равно, записывать алгоритм через рекурсию или через цикл. Если рекурсия не хвостовая, то стек вызовов будет всегда рости. Но проблема ещё в том, что С и С++ особенно не стремяться оптимизировать хвостовую рекурсию. Т.е. возможно существуют какие-то компиляторы, которые это умеют делать, но в массе этого не происходит. (для примера компилятор лиспа, который это не делает, принято считать ущербным и не годным для работы). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2012, 14:37 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
BykaMasterZiv, циклом - я видел примеры, но думал что это не самый лучший вариант. Дело в том, что я хотел еще спросить, как правильно передавать переменные в рекурсивную функцию, что бы не было переполнения стека? По значению?На платформе 8086 каждый вызов функции увеличивает стек: 1. на стек ложатся параметры функции (если передача параметров через стек) 2. на стек ложится адрес возврата из функции 3. на стеке отводится место под локальные переменные функции ИМХО рекурсия - зло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2012, 06:59 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
Благодарю, прояснили ситуацию:) Но, пока что у меня получилось сделать только таким образом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. Вот пытаюсь построить BST, но пока что получается один уровень построить Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. В результате 10 8 3 Как лучше организовать код? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2012, 16:28 |
|
||
|
Заполнить бинарное дерево
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2012, 19:12 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38047799&tid=2020644]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
176ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 356ms |
| total: | 618ms |

| 0 / 0 |
