数据结构二叉搜索树

来源:互联网 发布:美工助理英文 编辑:程序博客网 时间:2024/05/05 10:36
 #include <stdio.h>
#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);
}

 

原创粉丝点击