tree.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. typedef struct TreeNode
  5. {
  6. int val;
  7. struct TreeNode *left;
  8. struct TreeNode *right;
  9. } TreeNode;
  10. typedef struct StackNode
  11. {
  12. TreeNode *treeNode;
  13. struct StackNode *next;
  14. } StackNode;
  15. typedef struct Stack
  16. {
  17. StackNode *top;
  18. } Stack;
  19. void push(Stack *stack, TreeNode *treeNode)
  20. {
  21. StackNode *newNode = (StackNode *)malloc(sizeof(StackNode));
  22. newNode->treeNode = treeNode;
  23. newNode->next = stack->top;
  24. stack->top = newNode;
  25. }
  26. TreeNode *pop(Stack *stack)
  27. {
  28. if (stack->top == NULL)
  29. {
  30. return NULL;
  31. }
  32. StackNode *temp = stack->top;
  33. TreeNode *treeNode = temp->treeNode;
  34. stack->top = stack->top->next;
  35. free(temp);
  36. return treeNode;
  37. }
  38. int isEmpty(Stack *stack)
  39. {
  40. return stack->top == NULL;
  41. }
  42. void preorder(TreeNode *root)
  43. {
  44. if (root == NULL)
  45. {
  46. return;
  47. }
  48. Stack stack = {NULL};
  49. TreeNode *p = root;
  50. while (p != NULL || !isEmpty(&stack))
  51. {
  52. while (p != NULL)
  53. {
  54. printf("%d ", p->val);
  55. push(&stack, p);
  56. p = p->left;
  57. }
  58. p = pop(&stack);
  59. p = p->right;
  60. }
  61. }
  62. void inorder(TreeNode *root)
  63. {
  64. if (root == NULL)
  65. {
  66. return;
  67. }
  68. Stack stack = {NULL};
  69. TreeNode *p = root;
  70. while (p != NULL || !isEmpty(&stack))
  71. {
  72. while (p != NULL)
  73. {
  74. push(&stack, p);
  75. p = p->left;
  76. }
  77. p = pop(&stack);
  78. printf("%d ", p->val);
  79. p = p->right;
  80. }
  81. }
  82. void postorder(TreeNode *root)
  83. {
  84. if (root == NULL)
  85. {
  86. return;
  87. }
  88. Stack stack = {NULL};
  89. TreeNode *p = root;
  90. TreeNode *pre = NULL;
  91. do
  92. {
  93. while (p != NULL)
  94. {
  95. push(&stack, p);
  96. p = p->left;
  97. }
  98. p = pop(&stack);
  99. if (p->right == NULL || p->right == pre)
  100. {
  101. printf("%d ", p->val);
  102. pre = p;
  103. p = NULL;
  104. }
  105. else
  106. {
  107. push(&stack, p);
  108. p = p->right;
  109. }
  110. } while (!isEmpty(&stack));
  111. }
  112. void Postorderd(TreeNode *root)
  113. {
  114. if (root == NULL)
  115. {
  116. return;
  117. }
  118. Postorderd(root->left);
  119. Postorderd(root->right);
  120. printf("%d ", root->val);
  121. }
  122. TreeNode* createTreeNode(int val) {
  123. TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
  124. node->val = val;
  125. node->left = NULL;
  126. node->right = NULL;
  127. return node;
  128. }
  129. TreeNode* generateCompleteBinaryTree(int nodeCount) {
  130. if (nodeCount <= 0) {
  131. return NULL;
  132. }
  133. srand(time(NULL));
  134. TreeNode** nodes = (TreeNode**)malloc(nodeCount * sizeof(TreeNode*));
  135. for (int i = 0; i < nodeCount; i++) {
  136. nodes[i] = createTreeNode(rand() % 100 + 1);
  137. }
  138. for (int i = 0; i < nodeCount; i++) {
  139. if (2 * i + 1 < nodeCount) {
  140. nodes[i]->left = nodes[2 * i + 1];
  141. }
  142. if (2 * i + 2 < nodeCount) {
  143. nodes[i]->right = nodes[2 * i + 2];
  144. }
  145. }
  146. TreeNode* root = nodes[0];
  147. free(nodes);
  148. return root;
  149. }
  150. void printTreeStructure(TreeNode* root) {
  151. if (root == NULL) {
  152. return;
  153. }
  154. printf("%d ", root->val);
  155. if (root->left != NULL || root->right != NULL) {
  156. printf("(");
  157. printTreeStructure(root->left);
  158. printf(", ");
  159. printTreeStructure(root->right);
  160. printf(")");
  161. }
  162. }
  163. /*
  164. 生成的二叉树结构如下:
  165. 2
  166. / \
  167. / \
  168. 4 7
  169. / \ / \
  170. 9 11 22 44
  171. / \ /
  172. 66 88 99
  173. */
  174. TreeNode* generateSpecificBinaryTree()
  175. {
  176. int values[] = {2, 4, 7, 9, 11, 22, 44, 66, 88, 99};
  177. int nodeCount = sizeof(values) / sizeof(values[0]);
  178. TreeNode** nodes = (TreeNode**)malloc(nodeCount * sizeof(TreeNode*));
  179. for (int i = 0; i < nodeCount; i++) {
  180. nodes[i] = createTreeNode(values[i]);
  181. }
  182. for (int i = 0; i < nodeCount; i++) {
  183. if (2 * i + 1 < nodeCount) {
  184. nodes[i]->left = nodes[2 * i + 1];
  185. }
  186. if (2 * i + 2 < nodeCount) {
  187. nodes[i]->right = nodes[2 * i + 2];
  188. }
  189. }
  190. TreeNode* root = nodes[0];
  191. free(nodes);
  192. return root;
  193. }
备用站点 当前处于降级运行的备用站点,仅供应急访问,数据和功能可能不是最新。