summaryrefslogtreecommitdiff
path: root/c/dataStructure//btree.c
blob: f41c40420746c09b1190108bf510a2fc2bdac836 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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);
}