一个二叉查找树,插入建树有异常,大家帮忙看下,

一个二叉查找树,插入建树有错误,大家帮忙看下,急!
[code=C/C++][/code]#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct Tree
{
  int data;
  struct Tree *lchild;
  struct Tree *rchild;
  struct Tree *parent;
}Bit_Search_Tree,*BST;
//**************************************************
BST Tree_Search(BST root,int e) //二叉树递归查找
{
  BST p;
  p=root;
  if(p==NULL||p->data==e)
  return p;
  if(e<p->data)
  return Tree_Search(p->lchild,e);
  else
  return Tree_Search(p->rchild,e);
}
//**************************************************
BST Tree_Search2(BST root,int e) //二叉树非递归查找
{
  BST p;
  p=root;
  while(p&&p->data!=e)
  {
  if(e<p->data)
  p=p->lchild;
  else
  p=p->rchild;
  }
  return p;
}
//***************************************************
BST Tree_MINIMUM(BST root) //求子树最小值
{
  BST p;
  p=root;
  while(p->lchild)
  p=p->lchild;
  return p;
}
//***************************************************
BST Tree_MAXIMUM(BST root) //求子树最大值
{
  BST p;
  p=root;
  while(p->rchild)
  p=p->rchild;
  return p;
}
//************************************************
void Tree_INSERT(BST *root,int e) //在子树中插入元素
{
  BST x,y,z;
  x=*root;
  while(x)
  {
  y=x; //y是指示x的路线
  if(e<x->data) //寻找插入位置
  x=x->lchild;
  else
  x=x->rchild;
  }
  z=(BST)malloc(sizeof(Bit_Search_Tree)); //生成节点
  z->data=e; //将值赋给节点
  z->parent=y;  
  z->lchild=z->rchild=NULL;  
  if(y==NULL) //如果y为空,即这是棵子树
  (*root)=z;
  else //判断插入位置
  {
  if(z->data<y->data)
  y->lchild=z;
  else
  y->rchild=z;
  }
}
//****************************************************
BST Tree_SUCCESSOR(BST root,BST x) //求x的后继
{
  BST y;
  if(x->rchild)
  return Tree_MINIMUM(x->rchild);
  else
  {
  y=x->parent;
  while(y&&x==y->rchild)
  {
  x=y;
  y=y->rchild;
  }
  return y;
  }
}
   
//****************************************************
void Tree_DELETE(BST *root,BST z) //删除节点
{
  if(!z->lchild&&!z->rchild) //如节点没有子女
  {
  free(z);
  }
  else if(!z->lchild) //如果节点没有左节点
  {
  BST t;
  t=z;
  z=z->rchild;
  free(t);
  }
  else if(!z->rchild) //如果节点没有右节点
  {
  BST t;
  t=z;
  z=z->lchild;