summaryrefslogtreecommitdiff
path: root/c/dataStructure/408/tree
diff options
context:
space:
mode:
Diffstat (limited to 'c/dataStructure/408/tree')
-rwxr-xr-xc/dataStructure/408/tree/Makefile17
-rwxr-xr-xc/dataStructure/408/tree/main.c26
-rwxr-xr-xc/dataStructure/408/tree/treebin0 -> 20856 bytes
-rwxr-xr-xc/dataStructure/408/tree/tree.c83
-rwxr-xr-xc/dataStructure/408/tree/tree.h23
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
new file mode 100755
index 0000000..1e50b63
--- /dev/null
+++ b/c/dataStructure/408/tree/tree
Binary files differ
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