| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- typedef struct TreeNode
- {
- int val;
- struct TreeNode *left;
- struct TreeNode *right;
- } TreeNode;
- typedef struct StackNode
- {
- TreeNode *treeNode;
- struct StackNode *next;
- } StackNode;
- typedef struct Stack
- {
- StackNode *top;
- } Stack;
- void push(Stack *stack, TreeNode *treeNode)
- {
- StackNode *newNode = (StackNode *)malloc(sizeof(StackNode));
- newNode->treeNode = treeNode;
- newNode->next = stack->top;
- stack->top = newNode;
- }
- TreeNode *pop(Stack *stack)
- {
- if (stack->top == NULL)
- {
- return NULL;
- }
- StackNode *temp = stack->top;
- TreeNode *treeNode = temp->treeNode;
- stack->top = stack->top->next;
- free(temp);
- return treeNode;
- }
- int isEmpty(Stack *stack)
- {
- return stack->top == NULL;
- }
- void preorder(TreeNode *root)
- {
- if (root == NULL)
- {
- return;
- }
- Stack stack = {NULL};
- TreeNode *p = root;
- while (p != NULL || !isEmpty(&stack))
- {
- while (p != NULL)
- {
- printf("%d ", p->val);
- push(&stack, p);
- p = p->left;
- }
- p = pop(&stack);
- p = p->right;
- }
- }
- void inorder(TreeNode *root)
- {
- if (root == NULL)
- {
- return;
- }
- Stack stack = {NULL};
- TreeNode *p = root;
- while (p != NULL || !isEmpty(&stack))
- {
- while (p != NULL)
- {
- push(&stack, p);
- p = p->left;
- }
- p = pop(&stack);
- printf("%d ", p->val);
- p = p->right;
- }
- }
- void postorder(TreeNode *root)
- {
- if (root == NULL)
- {
- return;
- }
- Stack stack = {NULL};
- TreeNode *p = root;
- TreeNode *pre = NULL;
- do
- {
- while (p != NULL)
- {
- push(&stack, p);
- p = p->left;
- }
- p = pop(&stack);
- if (p->right == NULL || p->right == pre)
- {
- printf("%d ", p->val);
- pre = p;
- p = NULL;
- }
- else
- {
- push(&stack, p);
- p = p->right;
- }
- } while (!isEmpty(&stack));
- }
- void Postorderd(TreeNode *root)
- {
- if (root == NULL)
- {
- return;
- }
- Postorderd(root->left);
- Postorderd(root->right);
- printf("%d ", root->val);
- }
- TreeNode* createTreeNode(int val) {
- TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
- node->val = val;
- node->left = NULL;
- node->right = NULL;
- return node;
- }
- TreeNode* generateCompleteBinaryTree(int nodeCount) {
- if (nodeCount <= 0) {
- return NULL;
- }
- srand(time(NULL));
- TreeNode** nodes = (TreeNode**)malloc(nodeCount * sizeof(TreeNode*));
- for (int i = 0; i < nodeCount; i++) {
- nodes[i] = createTreeNode(rand() % 100 + 1);
- }
- for (int i = 0; i < nodeCount; i++) {
- if (2 * i + 1 < nodeCount) {
- nodes[i]->left = nodes[2 * i + 1];
- }
- if (2 * i + 2 < nodeCount) {
- nodes[i]->right = nodes[2 * i + 2];
- }
- }
- TreeNode* root = nodes[0];
- free(nodes);
- return root;
- }
- void printTreeStructure(TreeNode* root) {
- if (root == NULL) {
- return;
- }
- printf("%d ", root->val);
- if (root->left != NULL || root->right != NULL) {
- printf("(");
- printTreeStructure(root->left);
- printf(", ");
- printTreeStructure(root->right);
- printf(")");
- }
- }
- /*
- 生成的二叉树结构如下:
- 2
- / \
- / \
- 4 7
- / \ / \
- 9 11 22 44
- / \ /
- 66 88 99
- */
- TreeNode* generateSpecificBinaryTree()
- {
- int values[] = {2, 4, 7, 9, 11, 22, 44, 66, 88, 99};
- int nodeCount = sizeof(values) / sizeof(values[0]);
- TreeNode** nodes = (TreeNode**)malloc(nodeCount * sizeof(TreeNode*));
- for (int i = 0; i < nodeCount; i++) {
- nodes[i] = createTreeNode(values[i]);
- }
- for (int i = 0; i < nodeCount; i++) {
- if (2 * i + 1 < nodeCount) {
- nodes[i]->left = nodes[2 * i + 1];
- }
- if (2 * i + 2 < nodeCount) {
- nodes[i]->right = nodes[2 * i + 2];
- }
- }
- TreeNode* root = nodes[0];
- free(nodes);
- return root;
- }
|