summaryrefslogtreecommitdiff
path: root/c/dataStructure/408/tree/tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/dataStructure/408/tree/tree.c')
-rwxr-xr-xc/dataStructure/408/tree/tree.c83
1 files changed, 83 insertions, 0 deletions
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;
+}