排序二叉树的建立、插入、删除、查找

来源:互联网 发布:上古卷轴5清理脏数据 编辑:程序博客网 时间:2024/06/05 10:29

/*
名称:排序二叉树的建立、插入、删除、查找
说明:对于排序二叉树来说,其创建、插入和查找的算法差不多。简单来说,就是小了往左,大了往右。
对于二叉排序树的删除来说,稍微要复杂一点,要分成基本的几种情况:即
(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;    }}
原创粉丝点击