Случайное дерево поиска (СДП) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Листинг программы
  1. for(i = 0; i < n; i++)
  2. {
  3. AddTree(root, mass[i]);
  4. }
  5. ......
  6. ........
  7. void AddTree(Tree *root, int D)
  8. {
  9. Tree **p = &root;
  10. while((*p) != NULL)
  11. {
  12. if(D < (*p)->data) p = &((*p)->pleft);
  13. else if(D > (*p)->data) p = &((*p)->preight);
  14. }
  15. if((*p) == NULL)
  16. {
  17. (*p) = (Tree**)malloc(sizeof(Tree*));
  18. (*p)->data = D;
  19. (*p)->pleft = (*p)->preight = NULL;
  20. }
  21. }
Код не работает так как этого хотелось бы. Подскажите как доработать код.... И алгоритм вроде не сложных, но не получается... Есть код на ПАСКАЛЕ, его я и пытаюсь переделать.
Листинг программы
  1. procedure SDP(D: integer; var Root: pVertex);
  2. var p: ^pVertex;
  3. begin
  4. p := @Root;
  5. while p^ <> nil do
  6. if D < p^^.Data then
  7. p := @p^^.Left
  8. else if D > p^^.Data then
  9. p := @p^^.Right;
  10. if p^ = nil then
  11. begin
  12. new(p^);
  13. p^^.Data := D;
  14. p^^.Right := nil;
  15. p^^.Left := nil;
  16. end
  17. end;
  18. ...
  19. for i := 1 to n do
  20. SDP(a[i],Root2);

Решение задачи: «Случайное дерево поиска (СДП)»

textual
Листинг программы
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. struct tabTree
  7. {
  8. int data;
  9. struct tabTree *pleft;
  10. struct tabTree *preight;
  11. };
  12.  
  13. typedef struct tabTree Tree;
  14.  
  15. /* Количество операций */
  16. int op;
  17.  
  18. /* Прототипы функций */
  19. void AddTree(Tree **root, int D);
  20. Tree *BalansTree(int L, int R, int *mass);
  21. int TreeFind(Tree *p);
  22. int HeightTree(Tree *p);
  23. int Find(Tree *root, int X);
  24. /*********************/
  25.  
  26. void main()
  27. {
  28. Tree *root = NULL;
  29. int n, i, X;
  30. int *mass;
  31.  
  32. system("chcp 1251 > nul");
  33.  
  34. printf("\n Введите количество вершин в дереве (N):");
  35. scanf("%d", &n);
  36.  
  37. system("cls");
  38.  
  39. printf("\n Массив случайных чисел:\n\n");
  40. srand((unsigned)time(NULL));
  41. mass = (int*)malloc(sizeof(int) * n);
  42. if(mass == NULL) { printf("Memory error!"); return; }
  43.  
  44. for(i = 0; i < n; i++)
  45. {
  46. mass[i] = rand()%99 + 1;
  47. printf("%3d", mass[i]);
  48. if(i != 0 && i%10 == 0) printf("\n");
  49. }
  50.  
  51. for(i = 0; i < n; i++)
  52. {
  53. AddTree(&root, mass[i]);
  54. }
  55. printf("\n\n ***************************************************");
  56. printf("\n ДЕРЕВО ПОСТРОЕНО!");
  57. printf("\n ***************************************************");
  58. printf("\n Введите вершину для поиска: "); scanf("%d", &X);
  59.  
  60. printf("\n\n - Случайное дерево поиска (СДП)\n");
  61. printf("\t Высота дерева: %d", HeightTree(root));
  62. printf("\n\t %s деревом поиска", TreeFind(root) ? "Является" : "Не является");
  63. printf("\n\t Вершина %sнайдена", Find(root, X) ? "" : "не ");
  64. printf("\n\t Количество операций: %d", op);
  65.  
  66. root = BalansTree(0, n, mass);
  67. printf("\n\n - Идеально сбалансированное дерево поиска (ИСДП)\n");
  68. printf("\t Высота дерева: %d", HeightTree(root));
  69. printf("\n\t %s деревом поиска", TreeFind(root) ? "Является" : "Не является");
  70. printf("\n\t Вершина %sнайдена", Find(root, X) ? "" : "не ");
  71. printf("\n\t Количество операций: %d", op);
  72. printf("\n\n");
  73. free(mass);
  74. }
  75.  
  76. /* Случайное дерево поиска (СДП) */
  77. void AddTree(Tree **root, int D)
  78. {
  79. Tree **p = root;
  80.  
  81. while((*p) != NULL)
  82. {
  83. if(D < (**p).data)
  84. p = &((**p).pleft);
  85. else
  86. p = &((**p).preight);
  87. }
  88. if((*p) == NULL)
  89. {
  90. (*p) = (Tree*)malloc(sizeof(Tree));
  91. (**p).data = D;
  92. (**p).pleft = (**p).preight = NULL;
  93. }
  94. }
  95.  
  96. /* Идеально сбалансированное дерево поиска (ИСДП) */
  97. Tree *BalansTree(int L, int R, int *mass)
  98. {
  99. int m;
  100. Tree *p;
  101.  
  102. if(L > R) return NULL;
  103. else
  104. {
  105. m = (L + R)/2;
  106. p = (Tree*)malloc(sizeof(Tree));
  107. if(p == NULL) { printf("Memory error!"); exit(1);}
  108. p->data = mass[m];
  109. p->pleft = BalansTree(L, m - 1, mass);
  110. p->preight = BalansTree(m + 1, R, mass);
  111. return p;
  112. }
  113. }
  114.  
  115. /* Функция вычисления высоты дерева */
  116. int HeightTree(Tree *p)
  117. {
  118. int pl = 0;
  119. int pr = 0;
  120. if(p == NULL) return 0;
  121. else
  122. {
  123. pl = HeightTree(p->pleft);
  124. pr = HeightTree(p->preight);
  125. return 1 + ((pl > pr) ? pl : pr);
  126. }
  127. }
  128.  
  129. /* Является ли деревом поиска??? */
  130. int TreeFind(Tree *p)
  131. {
  132. if ((p == NULL && (p->pleft != NULL && (p->data <= p->pleft->data || !TreeFind(p->pleft)))) ||
  133. (p->preight != NULL && (p->data >= p->preight->data || !TreeFind(p->preight))))
  134. return 0;
  135. else
  136. return 1;
  137. }
  138. /* Поиск вершины */
  139. int Find(Tree *root, int X)
  140. {
  141. Tree *p = root;
  142.  
  143. op = 0;
  144. while(p != NULL)
  145. {
  146. op++;
  147. if(p->data == X) return 1;
  148. else p = (p->data > X) ? p->pleft : p->preight;
  149. }
  150. return 0;
  151. }

Объяснение кода листинга программы

  1. Структура данных для представления дерева - struct tabTree.
  2. Объявление переменных:
    • op - количество операций;
    • n - количество вершин в дереве;
    • i - номер вершины;
    • X - искомый элемент.
  3. Заполнение массива случайными числами.
  4. Построение дерева путем вызова функции AddTree для каждой вершины массива.
  5. Вывод информации о дереве:
    • высота дерева;
    • является ли дерево деревом поиска;
    • найдена ли искомая вершина;
    • количество операций.
  6. Создание идеально сбалансированного дерева путем вызова функции BalansTree для диапазона от 0 до n.
  7. Вывод информации об идеально сбалансированном дереве:
    • высота дерева;
    • является ли дерево деревом поиска;
    • найдена ли искомая вершина;
    • количество операций.
  8. Функция AddTree для добавления вершины в дерево.
  9. Функция BalansTree для создания идеально сбалансированного дерева.
  10. Функция HeightTree для вычисления высоты дерева.
  11. Функция TreeFind для проверки, является ли дерево деревом поиска.
  12. Функция Find для поиска вершины в дереве.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы