BST的查找、插入、删除

来源:互联网 发布:mac appstore 太慢 编辑:程序博客网 时间:2024/05/22 11:34

////  main.cpp//  BinarySearchTree//  //  教材讲解,请参考《数据结构》第二版 严蔚敏;对应源代码,请参考《数据结构解析》高一凡,这是配套严蔚敏的一个很好的源代码教材。//#include <iostream>#define N 7 /** Size of given array. */typedef int TElemType; /** Type of Element of tree. */typedef int KeyType;   /** Type of key. *//** Node of tree */typedef struct BiTNode{    struct BiTNode * lChild;    struct BiTNode * rChild;    TElemType data;}BiTNode, *BiTree;/** Creation of binary search tree that is linked list using a given array key. */void createBST(BiTree& bst, const KeyType a[], const int n);/** Traversing in infix order */void InfixOrderTraverse(const BiTree& bt);/**  * 在根指针T所指向的二叉树中进行递归查找等于key的值, * 若查找成功,则p指向该元素节点,并返回TRUE。 * 若查找不成功,则p指向路径中访问的最后一个节点,并返回false。 * f指向T的双亲,初始为NULL。 */ bool SearchBST(BiTree T, KeyType key, BiTree f, BiTree& p);/**  * 当BST中无查找的值时,则插入该值,并返回true,否则返回false。 */bool InsertBST(BiTree& T, const KeyType& key);/** * 若BST中存在这样的节点,则删除该节点,并返回true。否则返回false。 */bool DeleteBST(BiTree& T, const KeyType& key);/** * 删除该节点,并重接它的左子树或右子树。 */bool Delete(BiTree& p);int main (int argc, const char * argv[]){    BiTree bst = NULL/*, p = NULL*/;    KeyType a[N] = {1,4,9,6,3,8,89};    createBST(bst, a, N);    /*     if(SearchBST(bst, 4, NULL, p))     std::cout << " " << p->data << "\n";     else     std::cout << "没有找到.\n";     */    InsertBST(bst, 10);    InfixOrderTraverse(bst);    std::cout << "\n";    DeleteBST(bst, 10);    InfixOrderTraverse(bst);    free(bst);    return 0;}void createBST(BiTree& bst, const KeyType* a, const int n){    BiTree nodePtr,Ptr;    nodePtr = NULL;    for (int i=0; i<n; i++)    {        Ptr = bst;        while (Ptr)        {//找到合适的位置            if(Ptr->data == a[i])                break;            else if(a[i] > Ptr->data)            {//进入左子树                nodePtr = Ptr;                   Ptr = Ptr->rChild;            }            else            {//进入右子树                nodePtr = Ptr;                 Ptr = Ptr->lChild;            }         }                if (!Ptr)        {//到达叶节点(合适位置),新建一个临时节点,并插入值.            BiTNode* tempPtr = (BiTNode*)malloc(sizeof(BiTNode));            tempPtr->lChild = tempPtr->rChild = NULL;            tempPtr->data = a[i];                        if(nodePtr)            {//树非空                if(tempPtr->data < nodePtr->data)                    nodePtr->lChild = tempPtr;                else                    nodePtr->rChild = tempPtr;            }            else //树空,即根节点为空                bst = tempPtr;        }     }}void InfixOrderTraverse(const BiTree& bt){//Traversing by infix order.That is to say, it will be order by ascending.    if(bt)    {        InfixOrderTraverse(bt->lChild);        std::cout << bt->data << " ";        InfixOrderTraverse(bt->rChild);    }}bool SearchBST(BiTree T, KeyType key, BiTree f, BiTree& p){    if(!T)    {//子树为空        p = f;         return false;     }    if(key == T->data)    {//找到该值        p = T;         return true;    }    else if(key < T->data) //比key值大,到左子树查找        return SearchBST(T->lChild, key, T, p);    else //比key值小,到右子树查找        return SearchBST(T->rChild, key, T, p);}bool InsertBST(BiTree& T, const KeyType& key){    BiTree p = NULL;    if(!SearchBST(T,key,NULL,p))    {//查找不成功        BiTNode* temp = (BiTNode*)malloc(sizeof(BiTNode));        temp->data = key;        temp->lChild = temp->rChild = NULL;        if(!p) //被插节点作为新的根节点            T = temp;        if(key < p->data) //作为左孩子            p->lChild = temp;        else              //作为有孩子            p->rChild = temp;        return true;    }    else        return false; /** The key is existing. */}bool DeleteBST(BiTree& T, const KeyType& key){    if(!T) //没找到等于key值的节点        return false;    else    {        if(key == T->data) //找到等于key值的节点            return Delete(T);        else if(key < T->data)            return DeleteBST(T->lChild, key);        else            return DeleteBST(T->rChild, key);    }}bool Delete(BiTree& p){    BiTree q;     if(!p->rChild)    {//Only the child left is NULL.        q = p;        p = p->lChild;        free(q);        return true;    }    else if(!p->lChild)    {//Only the child right is NULL.        q = p;        p = p->rChild;        free(q);        return true;    }    else    {//Both child left and child right are not NULL.        BiTree s;        q = p;        s = p->lChild; //先向左走一步        while(s->rChild)        {//再向右走到尽头            q = s;            s = s->rChild;        }        p->data = s->data;        if(q != p) //p的右子树的左子树不为空时            q->rChild = s->lChild;        else  //p的右子树的左子树为空时            q->lChild = s->lChild;        free(s);        return true;    }    return false;}


原创粉丝点击