#include <stdlib.h>
#define MAXSIZE 10
typedef struct node
{
int item;
struct node *left;
struct node *right;
}NODE;
typedef struct tree
{
NODE *root;
int size;
}TREE;
typedef struct pair
{
NODE *parent;
NODE *child;
}PAIR;
void InitTree(TREE *ptree)
{
ptree->root = NULL;
ptree->size = 0;
}
bool TreeIsEmpty(const TREE *ptree)
{
if(ptree->root == NULL)
return true;
else
return false;
}
bool TreeIsFull(const TREE *ptree)
{
if(ptree->size == MAXSIZE)
return true;
else
return false;
}
int TreeItemCount(const TREE *ptree)
{
return ptree->size;
}
static bool ToLeft(const int item1, const int item2)
{
if(item1 <= item2)
return true;
else
return false;
}
static bool ToRight(const int item1, const int item2)
{
if(item1 <= item2)
return true;
else
return false;
}
static NODE *MakeNode(const int item)
{
NODE *new_node;
new_node = (NODE *)malloc(sizeof(NODE));
if(new_node != NULL)
{
new_node->item = item;
new_node->left = NULL;
new_node->right = NULL;
}
return new_node;
}
static void AddNode(NODE *new_node, NODE *root)
{
if(ToLeft(new_node->item, root->item))
{
if((root->left)== NULL)
root->left = new_node;
else
AddNode(new_node,root->left);
}
else if(ToRight(new_node, root->item))
{
if(root->right == NULL)
root->right = new_node;
else
AddNode(new_node, root->right);
}
else
{
printf("loacation error in AddNode\n");
exit(1);
}
}
//注意ptr是指向目标节点的父节点(parent)指针成员(child)的地址即pair_ob.parent.child
static void DeleteNode(NODE **ptr)
{
NODE *temp;
puts((*ptr)->item);
if((*ptr)->left == NULL)
{
temp = *ptr;
*ptr = (*ptr)->right;
free(temp);
}
else if((*ptr)->right == NULL)
{
temp = *ptr;
*ptr = (*ptr)->left;
free(temp);
}
else
{
for(temp = (*ptr)->left; temp->right != NULL; temp = temp->right)
{
}
temp->right = (*ptr)->right;
temp = *ptr;
*ptr = (*ptr)->left;
free(temp);
}
}
static void DeleteAllNodes(NODE * root)
{
NODE *pright;
if(root != NULL)
{
pright = root->right;
DeleteAllNodes(root->left);
free(root);
DeleteAllNodes(pright);
}
}
void DeleteAll(TREE *ptree)
{
if(ptree != NULL)
DeleteAllNodes(ptree->root);
ptree->root = NULL;
ptree->size = 0;
}
//设计成返回包含两个指针的结构,一个指针指向包含该项目的节点,一个指向父节点。
static PAIR SeekItem(const int item, const TREE *ptree)
{
PAIR look;
look.parent = NULL;
look.child = ptree->root;
if(look.child == NULL)
return look;
while(look.child != NULL)
{
if(ToLeft(item,look.child.item))
{
look.parent = look.child;
look.child = look.child->left;
}
else if(ToRight(item,look.child.item))
{
look.parent = look.child;
look.child = look.child->right;
}
else
break//如果前面都不是,则找到了,look.child是目标项目的地址
}
return look;
}
bool AddItem(const int item, TREE *ptree)
{
NODE *new_node;
if(TreeIsFull(ptree))
{
printf("Tree is full\n");
return false;
}
if(SeekItem(pi,ptree).child != NULL)
{
printf("Attemped to add duplicate item\n");
return false;
}
new_node = MakeNode(pi);
if(new_node == NULL)
{
printf("canot create node\n");
return false;
}
ptree->size++;
if(ptree->root == NULL)
ptree->root = new_node;
else
AddNode(new_node, ptree->root);
return true;
}
bool DeleteItem(const int item, TREE *ptree)
{
PAIR look;
look = SeekItem(item, ptree);
if(look.child == NULL)
return false;
if(look.parent == NULL)
DeleteNode(&ptree->root);
else if(look.parent->left == look.child)
DeleteNode(&look.parent->left);
else
DeleteNode(&look.parent->right);
ptree->size--;
return true;
}
//遍历树,首先处理左子树,然后处理项目,最后处理右子树
static void InOrder(const NODE *root, void (*pfun)(int item))
{
if(root != NULL)
{
InOrder(root->left, pfun);
(*pfun)(root->item);
InOrder(root->right, pfun);
}
}
void Traverse(const TREE *ptree, void (*pfun)(int item))
{
if(ptree != NULL)
InOrder(ptree->root, pfun);
}