/*
名称:排序二叉树的建立、插入、删除、查找
说明:对于排序二叉树来说,其创建、插入和查找的算法差不多。简单来说,就是小了往左,大了往右。
对于二叉排序树的删除来说,稍微要复杂一点,要分成基本的几种情况:即
(1)、删除的结点是叶子节点
(2)、删除结点只有左子树或者只有右子树
(3)、删除的结点既有左子树、又有右子树
此外还要注意删除的结点是否是根节点,程序中需要稍微注意一下。
*/
//二叉排序树的插入
int BST_Insert(BiTree &T,int key)
{
if(T == NULL)
{
T = new BiTNode;
T->data = key;
T->lchild = T->rchild = NULL;
return 0; //插入成功
}
else if(T->data == key)
return -1; //树中已经含有元素,插入失败
else if(T->data < key)
return BST_Insert(T->rchild,key);
else
return BST_Insert(T->lchild,key);
}
//创建二叉排序树
void Creat_BSTree(BiTree &T)
{
int val = 0;
cin>>val;
while(-1 != val)
{
if(BST_Insert(T,val) == -1)
cout<<"element has existed already , insert failed!"<<endl;
cin>>val;
}
}
//二叉排序树的查找
BiTNode * BST_Search(BiTree T,int key)
{
BiTNode *p = T;
while(p != NULL)
{
if(p->data < key)
p = p->rchild; //转向右子树
else if(p->data > key)
p = p->lchild; //转向左子树
else
{
return p;
}
}
return NULL; //返回值为空代表未查找到指定元素
}
//二叉排序树的删除
bool DelInBSTree(BiTree &T,int key)
{
BiTNode *p = T,*pre = NULL;
//判断待删除的节点是不是根节点,如果是根节点的话,需要特殊处理下
if(T != NULL && T->data == key )
{
if(T->rchild != NULL)
T = T->rchild;
else if(T->lchild != NULL)
T = T->lchild;
else
T = NULL;
return true;
}
else //删除的不是根结点
{
while(p != NULL)
{
if(p->data < key)
{
pre = p;
p = p->rchild; //转向右子树
}
else if(p->data > key)
{
pre = p;
p = p->lchild; //转向左子树
}
else
break;
}
if(p == NULL)
return false;
else
{
//若p的左子树和右子树都不为空时
if(p->lchild != NULL && p->rchild != NULL) //p的左子树和右子树都不为空
{
pre = p;
BiTNode *temp = pre->rchild; //temp指向待删除结点的后继结点,即上移元素后要删除的结点
//找到待删除元素的直接后继结点,用其代替当前节点
while(temp->lchild != NULL)
{
pre = temp;
temp = temp->lchild;
}
p->data = temp->data; //上移元素
p = temp;
}
//如果被删除元素是叶子节点
if(p->lchild == NULL && p->rchild == NULL)
{
//将待删除结点的父节点对应指针域赋空
if(pre->lchild == p)
pre->lchild = NULL;
else if(pre->rchild == p)
pre->rchild = NULL;
delete p; //删除指定结点
}
else if(p->lchild == NULL) //被删除结点的左子树为空,右子树不空
{
if(pre->lchild == p)
pre->lchild = p->rchild;
else if(pre->rchild == p)
pre->rchild = p->rchild;
delete p;
}
else if(p->rchild == NULL) //被删除结点的右子树为空,左子树不空
{
if(pre->lchild == p)
pre->lchild = p->lchild;
else if(pre->rchild == p)
pre->rchild = p->lchild;
delete p;
}
}
return true;
}
}