diff options
Diffstat (limited to 'c/dataStructure/408/tree')
-rwxr-xr-x | c/dataStructure/408/tree/Makefile | 17 | ||||
-rwxr-xr-x | c/dataStructure/408/tree/main.c | 26 | ||||
-rwxr-xr-x | c/dataStructure/408/tree/tree | bin | 0 -> 20856 bytes | |||
-rwxr-xr-x | c/dataStructure/408/tree/tree.c | 83 | ||||
-rwxr-xr-x | c/dataStructure/408/tree/tree.h | 23 |
5 files changed, 149 insertions, 0 deletions
diff --git a/c/dataStructure/408/tree/Makefile b/c/dataStructure/408/tree/Makefile new file mode 100755 index 0000000..85ea9c1 --- /dev/null +++ b/c/dataStructure/408/tree/Makefile @@ -0,0 +1,17 @@ +CC = gcc +SRC = *.c +FLGS = -Wall -Werror -g +OPT = ./tree + +ALL: link run clean + +link: + @$(CC) $(SRC) $(FLGS) -o $(OPT) +run: + $(OPT) + +gdb: link + gdb $(OPT) + +clean: + @rm $(OPT) diff --git a/c/dataStructure/408/tree/main.c b/c/dataStructure/408/tree/main.c new file mode 100755 index 0000000..c879362 --- /dev/null +++ b/c/dataStructure/408/tree/main.c @@ -0,0 +1,26 @@ +#include "tree.h" + +int main(void) +{ + Tree tree; + + initTree(&tree); + + printf("the size of tree now is %d\n",tree.size); + + insertTree(&tree,3); + insertTree(&tree,4); + insertTree(&tree,2); + insertTree(&tree,1); + + printTree(tree.root); + putchar('\n'); + + printf("the size of tree now is %d\n",tree.size); + + freeTree(&tree); + + printf("the size of tree now is %d\n",tree.size); + + return 0; +} diff --git a/c/dataStructure/408/tree/tree b/c/dataStructure/408/tree/tree Binary files differnew file mode 100755 index 0000000..1e50b63 --- /dev/null +++ b/c/dataStructure/408/tree/tree diff --git a/c/dataStructure/408/tree/tree.c b/c/dataStructure/408/tree/tree.c new file mode 100755 index 0000000..26dc81e --- /dev/null +++ b/c/dataStructure/408/tree/tree.c @@ -0,0 +1,83 @@ +#include "tree.h" + +void initTree(Tree * T) +{ + T->root = NULL; + T->size = 0; +} + +// insertTree helper +static Node * createNode(int e) +{ + Node * tmp = (Node *) malloc (sizeof(Node)); + if (!tmp) + { + fprintf(stderr,"Node creation failed!\n"); + exit(EXIT_FAILURE); + } + + tmp->data = e; + tmp->lchild = NULL; + tmp->rchild = NULL; + + return tmp; +} + +static void insertNode(Node * root, Node * new) +{ + if (root->data > new->data) + { + if (!root->lchild) + root->lchild = new; + else + insertNode(root->lchild,new); + } + else if (root->data < new->data) + { + if (!root->rchild) + root->rchild = new; + else + insertNode(root->lchild,new); + } + else + fprintf(stderr,"Binary tree can't hold two identical element.\n"); +} + +bool insertTree(Tree * T, int e) +{ + Node * tmp = createNode(e); + + if (T->size == 0) + T->root = tmp; + else + insertNode(T->root,tmp); + T->size++; + + return true; +} + +void printTree(Node * root) +{ + if (root->lchild) + printTree(root->lchild); + if (root->rchild) + printTree(root->rchild); + printf("%d ",root->data); +} + +// freeTree helper +void freeNode(Node * root) +{ + Node * tmp = root; + if (tmp->lchild) + freeNode(tmp->lchild); + if (tmp->rchild) + freeNode(tmp->rchild); + free(tmp); +} + +void freeTree(Tree * T) +{ + freeNode(T->root); + T->size = 0; +} diff --git a/c/dataStructure/408/tree/tree.h b/c/dataStructure/408/tree/tree.h new file mode 100755 index 0000000..659d7ef --- /dev/null +++ b/c/dataStructure/408/tree/tree.h @@ -0,0 +1,23 @@ +#ifndef _TREE_H +#define _TREE_H + +#include<stdio.h> +#include<stdlib.h> +#include<stdbool.h> + +typedef struct node { + int data; + struct node * lchild, * rchild; +} Node; + +typedef struct { + Node * root; + int size; +} Tree; + +void initTree(Tree * T); +bool insertTree(Tree * T, int e); +void printTree(Node * root); +void freeTree(Tree * T); + +#endif |