function.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #include "function.h"
  2. static node* FindNode(node* root, int key);
  3. static node* FindNextItem(node* _node);
  4. static node* FindParent(node*, int);
  5. node * CreateTree(int value) {
  6. node * tmp = (node *) malloc(sizeof(node));
  7. tmp->key = value;
  8. tmp->left = tmp->right = NULL;
  9. return tmp;
  10. }
  11. node * InsertTree(node* root, int value) {
  12. node * tmp = root;
  13. node * parent = NULL;
  14. while (tmp != NULL) {
  15. parent = tmp;
  16. if (value == tmp->key)
  17. break;
  18. else if (tmp->key > value)
  19. tmp = tmp->left;
  20. else if (tmp->key < value)
  21. tmp = tmp->right;
  22. }
  23. if (!tmp) {
  24. tmp = CreateTree(value);
  25. if (parent->key < tmp->key)
  26. parent->right = tmp;
  27. if (parent->key > tmp->key)
  28. parent->left = tmp;
  29. }
  30. return tmp;
  31. }
  32. void PrintTree(node* root, int level) {
  33. if (root != NULL) {
  34. PrintTree(root->right, level + 1);
  35. for (int i = 0; i < level; i++) printf("\t");
  36. printf("%d\n", root->key);
  37. PrintTree(root->left, level + 1);
  38. }
  39. }
  40. void DestroyTree(node* root) {
  41. if (root) {
  42. DestroyTree(root->right);
  43. DestroyTree(root->left);
  44. free(root);
  45. if (root)
  46. root = NULL;
  47. }
  48. }
  49. int AmountVertex(node* root) {
  50. if (root) {
  51. int count = AmountVertex(root->left) + AmountVertex(root->right);
  52. if (root->left != NULL && root->right != NULL)
  53. count += 1;
  54. return count;
  55. } else
  56. return 0;
  57. }
  58. void DeleteNode(node* root, int key) {
  59. node* _node = FindNode(root, key);
  60. node* parent = FindParent(root, key);
  61. node* tmp = NULL;
  62. node* next_node = NULL;
  63. int value = 0;
  64. if (_node == NULL) {
  65. printf("Not find this ->%d<- element\n", key);
  66. return;
  67. }
  68. if (parent == NULL && !_node->left && _node->right) {
  69. tmp = root->right;
  70. root->key = tmp->key;
  71. root->right = tmp->right;
  72. free(tmp);
  73. if (tmp)
  74. tmp = NULL;
  75. return;
  76. } else if (parent == NULL && _node->left && !_node->right) {
  77. tmp = root->left;
  78. root->key = tmp->key;
  79. root->left = tmp->left;
  80. free(tmp);
  81. if (tmp)
  82. tmp = NULL;
  83. return;
  84. }
  85. if (parent == NULL && _node->left == _node->right) {
  86. printf("Root %d remove from tree\n", root->key);
  87. free(root);
  88. if (root)
  89. root = NULL;
  90. }
  91. // 1: lists
  92. else if (!_node->left && !_node->right) {
  93. printf("Node %d remove from tree\n", _node->key);
  94. if (parent->key > key) {
  95. free(_node);
  96. parent->left = NULL;
  97. } else if (parent->key < key) {
  98. free(_node);
  99. parent->right = NULL;
  100. }
  101. }
  102. // 2: have one child
  103. else if (_node->left && !_node->right) {
  104. printf("Node %d remove from tree\n", _node->key);
  105. if (parent->left->key == key) {
  106. tmp = _node->left;
  107. free(_node);
  108. parent->left = tmp;
  109. } else if (parent->right->key == key) {
  110. tmp = _node->left;
  111. free(_node);
  112. parent->right = tmp;
  113. }
  114. } else if (!_node->left && _node->right) {
  115. printf("Node %d remove from tree\n", _node->key);
  116. if (parent->left->key == key) {
  117. tmp = _node->right;
  118. free(_node);
  119. parent->left = tmp;
  120. } else if (parent->right->key == key) {
  121. tmp = _node->right;
  122. free(_node);
  123. parent->right = tmp;
  124. }
  125. }
  126. // 3: have two child
  127. else if (_node->left && _node->right) {
  128. printf("Node %d remove from tree\n", _node->key);
  129. next_node = FindNextItem(_node);
  130. value = next_node->key;
  131. DeleteNode(root, value);
  132. _node->key = value;
  133. }
  134. }
  135. static node * FindNode(node* root, int key) {
  136. node * tmp = root;
  137. while (tmp != NULL && tmp->key != key) {
  138. if (key > tmp->key)
  139. tmp = tmp->right;
  140. else if (key < tmp->key)
  141. tmp = tmp->left;
  142. }
  143. return tmp;
  144. }
  145. static node* FindParent(node* root, int key) {
  146. node * tmp = root;
  147. node * parent = NULL;
  148. while (tmp != NULL && tmp->key != key) {
  149. parent = tmp;
  150. if (key > tmp->key)
  151. tmp = tmp->right;
  152. else if (key < tmp->key)
  153. tmp = tmp->left;
  154. }
  155. return parent;
  156. }
  157. static node * FindNextItem(node* _node) {
  158. node * tmp = _node->right;
  159. while (tmp->left != NULL)
  160. tmp = tmp->left;
  161. return tmp;
  162. }