二叉排序树

来源:互联网 发布:淘宝计入最低价 编辑:程序博客网 时间:2024/05/29 19:17

二叉排序树

代码:

typedef struct BiTNode{    int data;    struct BiTNode *lchild, *rchild;} BiTNode, *BiTree;

二叉排序树的查找操作

方法:

当二叉树不为空时,首先将给定值与根节点的关键字进行比较,若相等,则查找成功,否则根据给定值与根节点的关键字之间的

大小关系,在左子树或右子树上继续进行查找。

代码:

bool SearchBST(BiTree T, int key ){    if( !T )    {        return false;    }    else    {        if( key == T->data )        {            return true;        }        else if( key > T->data )            return SearchBST( T->rchild, key );  //在右子树继续查找        else            return SearchBST( T->lchild, key );  //在左子树继续查找    }}
二叉排序树的插入操作

方法:

对二叉树进行查找,当树中不存在该关键字时再进行插入。插入的结点一定是一个新添加的叶子结点,并且是查找不成功时查找路径上访问的最后

一个结点的左孩子或者右孩子。

代码:

bool SearchBST(BiTree T, int key, BiTree f, BiTree &res ){    /*    递归查找。其中,指针f指向T的双亲,其初始调用值为NULL    若查找成功,则指针res指向该数据元素节点,并返回TRUE;    若查找失败,则指针res指向查找路径上访问的最后一个节点,并返回FALSE    */    if( !T )    {        res = f;     //这是f唯一被用到的位置。        return false;    }    else    {        if( key == T->data )        {            res = T;            return true;        }        else if( key > T->data )            return SearchBST( T->rchild, key, T, res );  //在右子树继续查找        else            return SearchBST( T->lchild, key, T, res );  //在左子树继续查找    }}bool InsertBST( BiTree &T, int key ){    BiTree p, s;    if( !SearchBST( T, key, NULL, p ) )    {        s = (BiTree)malloc(sizeof(BiTNode));        s->data = key;        s->lchild = s->rchild = NULL;        if( !p )            T = s;                //s为根节点,之前的树为空树        else if( key > p->data )            p->rchild = s;        //s为右孩子        else            p->lchild = s;        //s为左孩子        return true;    }    return false;}

二叉排序树的删除操作

方法:

对二叉树进行删除时,首先在树中找到关键字等于给定值的结点,然后对该结点进行删除,根据被删除结点的情况进行如下:

1)如果被删除结点是叶子节点,那么直接删除即可

2)如果仅有左子树或右子树,那么上移子树即可

3)如果同时有左右子树,那么用删除节点的直接前驱或者直接后继来替换当前节点,并从二叉树中删除直接前驱或者直接后继

代码:

void Delete(BiTree &p){    BiTree q, s;    if( !p->lchild && !p->rchild ) // p为叶子节点        p = NULL;    else if( !p->lchild ) //左子树为空,只需重接右子树    {        q = p;        p = p->rchild;        free(q);    }    else if( !p->rchild ) //右子树为空,只需重接左子树    {        q = p;        p = p->lchild;        free(q);    }    else                  //左右子树均不为空    {        q = p;        s = p->lchild;        while(s->rchild)  //转左,然后向右走到尽头        {            q = s;            s = s->rchild;        }        p->data = s->data;        if( q != p )                //判断是否执行上述while循环            q->rchild = s->lchild;  //执行上述while循环,重接右子树        else            q->lchild = s->lchild;  //未执行上述while循环,重接左子树        free(s);    }}void DeleteBST(BiTree &T, int key){    // 若二叉排序树T中存在关键字等于key的数据元素,则删除该数据元素节点    if(!T) //不存在关键字等于key的数据元素        return;    else    {        if(key == T->data)            Delete(T);        else if( key < T->data)            DeleteBST(T->lchild, key);        else            DeleteBST(T->rchild, key);    }}



0 0
原创粉丝点击