/*------------------------------------------------------------------*/
typedef struct node
{
   int data;
   struct node* lchild;
   struct node* rchild; 
}Tree,*PTree;

//data of tree struct
/*------------------------------------------------------------------*/
PTree create_node(int value)
{
   PTree new_node=NULL;
   new_node = (PTree)malloc(sizeof(Tree));
   new_node->lchild = new_node->rchild = NULL;
   new_node->data = value;
   return (new_node);
}//create a new tree node

/*------------tree insert use recursion-----------------------------*/
void insert_tree(PTree _root, int value)
{
   if(NULL==_root || value==_root->data)
   {
      return; 
   }//when insert value equal root->data,or root is null.just return
   else if(value < _root->data)
   {
      if(_root->lchild==NULL)//find the node,and insert it
      {
         _root->lchild = create_node(value);  
         return;
      }
      else//left tree not null,so recursion again
      {
         insert_tree(_root->lchild,value);
      }
   }//find in left child tree
   else
   {
      if(_root->rchild == NULL)//find the node,and insert it
      {
         _root->rchild = create_node(value); 
      }  
      else//right tree not null,so recursion again
      {
         insert_tree(_root->rchild,value);
      }
    }//find in right child tree
  }

/*------------delete a singel node-----------------------------*/

PTree delete_node(PTree _root)

  PTree p=pre=NULL;
   if(NULL == _root->lchild)
   {
      p = _root;
      _root = _root->rchild;
      free(p);
   }
  else if(NULL == _root->rchild)
   {
      p = _root;
      _root = _root->lchild;
      free(p);
   }
   else
   {
      pre = _root;
      p = _root->lchild;
  
      while(p->rchild)   //step to next left child tree
      {
       pre = p;
         p = p->rchild; 
      }
      _root->data = p->data;//value exchange
  
      if(pre == _root)
      {
         pre->lchild = p->lchild;  
      }//the root->lchild's right is null
      else
      {
         pre->rchild = p->lchild;
      }
      free(p);
   } 
   return (_root);
}

/*------------delete node use recursion-----------------------------*/

PTree delete_tree(PTree _root, int _value)
{
   if(_root)
   {
      if(_value == _root->data)
      {
         _root = delete_node(_root);
      }
      else if(_value < _root->data)
      {
         _root = delete_tree(_root->lchild, _value); 
      }
      else
      {
         _root = delete_tree(_root->rchild, _value); 
      }
   }
   return (_root); 
}

posted on 2012-09-10 09:50  gooner  阅读(701)  评论(0)    收藏  举报