summaryrefslogtreecommitdiff
path: root/c/dataStructure//btree.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/dataStructure/树/btree.c')
-rwxr-xr-xc/dataStructure/树/btree.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/c/dataStructure/树/btree.c b/c/dataStructure/树/btree.c
new file mode 100755
index 0000000..f41c404
--- /dev/null
+++ b/c/dataStructure/树/btree.c
@@ -0,0 +1,91 @@
+#include "btree.h"
+
+void InitTree(Tree * ptree)
+{
+ ptree->root = NULL;
+ ptree->size = 0;
+}
+
+bool EmptyTree(const Tree * ptree)
+{
+ return !ptree->root?true:false;
+}
+
+int CountItem(const Tree * ptree)
+{
+ return ptree->size;
+}
+
+
+static bool ToLeft(ElemType e1, ElemType e2)
+{
+ return e1 < e2;
+}
+static bool ToRight(ElemType e1, ElemType e2)
+{
+ return e1 > e2;
+}
+static bool AddNode(Node * new, Node * root)
+{
+ if (ToLeft(new->e, root->e))
+ {
+ if (root->left == NULL)
+ root->left = new;
+ else
+ AddNode(new,root->left);
+ }
+ else if (ToRight(new->e,root->e))
+ {
+ if (root->right == NULL)
+ root->right = new;
+ else
+ AddNode(new,root->right);
+ }
+ else
+ return false;
+ return true;
+}
+
+bool AddItem(const ElemType e, Tree * ptree)
+{
+ Node * new = (Node *) calloc (1,sizeof(Node));
+ if (!new)
+ return false;
+ new->e = e;
+
+ ptree->size++;
+
+ if (!ptree->root)
+ ptree->root = new;
+ else
+ AddNode(new,ptree->root);
+
+ return true;
+}
+
+bool ResTree(Node * root)
+{
+ Node * pnode = root;
+ if (pnode->right)
+ {
+ ResTree(pnode->right);
+ free(pnode);
+ }
+ else if (pnode->left)
+ {
+ ResTree(pnode->left);
+ free(pnode);
+ }
+ else
+ free(pnode);
+ return true;
+}
+
+void PrintTree(const Node * root)
+{
+ printf("%c",root->e);
+ if (root->left)
+ PrintTree(root->left);
+ if (root->right)
+ PrintTree(root->right);
+}