二叉排序树的相关操作

#include <IOSTREAM.H>

#include <STDLIB.H>

//二叉树的生成和释放

typedef struct Node

{

    int data;

    struct Node * pParent;

    struct Node * pLeftChild;

    struct Node * pRightChild;

}Node;



Node * Create_BTree(int *array,Node* pParent=NULL)//二叉排序树的创建,按照先序遍历的方法进行构造

{

    static int i=0;

    if (array[i]==0)

    {

        return NULL;

    }

    Node *temp=(Node *)malloc(sizeof(Node));

    temp->data=array[i];

    temp->pParent=pParent;

    i++;

    temp->pLeftChild=Create_BTree(array,temp);

    i++;

    temp->pRightChild=Create_BTree(array,temp);

    return temp;

}

void Mid_Order(Node* tree)//二叉排序树的中序遍历

{

    if (tree==NULL)

    {

        return;

    }

    Mid_Order(tree->pLeftChild);

    cout<<tree->data<<" ";

    Mid_Order(tree->pRightChild);

}

void Destroy_BTree(Node* tree)//二叉排序树的是否

{

    if (tree==NULL)

    {

        return;

    }

    Destroy_BTree(tree->pLeftChild);

    Destroy_BTree(tree->pRightChild);

    free(tree);

}

Node* Tree_Search(Node* tree,int x)//二叉排序树的查找

{

    Node* temp=tree;

    while(temp)

    {

        if(temp->data==x)

            break;

        else if(temp->data>x)

            temp=temp->pLeftChild;

        else

            temp=temp->pRightChild;

    }

    return temp;

}

Node * Tree_Minimum(Node* tree)//二叉排序树的最小节点

{

    while(tree&&tree->pLeftChild)

    {

        tree=tree->pLeftChild;

    }

    return tree;

}

Node * Tree_Maximum(Node* tree)//二叉排序树的最大节点

{

    while(tree&&tree->pRightChild)

    {

        tree=tree->pRightChild;

    }

    return tree;

}

Node * Tree_Successor(Node *p)//返回节点p的后继//中序遍历

{

    if(p==NULL)

        return p;

    else if(p->pRightChild)

        return Tree_Minimum(p->pRightChild);

    else

    {

        while(p->pParent&&p->pParent->pRightChild==p)

            p=p->pParent;

        return p->pParent;

    }



}

Node *Tree_PreDecessor(Node* p)//中序遍历 求p的前驱节点

{

    if (p==NULL)

        return p;

    else if(p->pLeftChild)

        return Tree_Maximum(p->pLeftChild);

    else

    {

        while(p->pParent&&p->pParent->pLeftChild==p)

            p=p->pParent;

        return p->pParent;

    }

}

void  Tree_Insert(Node* &tree,int x)//给二叉排序树插入新节点

{

    Node * pNodeNew=(Node*)malloc(sizeof(Node));

    pNodeNew->pLeftChild=NULL;

    pNodeNew->pRightChild=NULL;

    pNodeNew->data=x;

    if(tree==NULL)

    {

        pNodeNew->pParent=NULL;

        tree=pNodeNew;

        return;

    }

    Node * pTempParent=NULL,*pTemp=tree;

    while(pTemp)

    {

        pTempParent=pTemp;

        if (pTemp->data<x)

        {

            pTemp=pTemp->pRightChild;

        } 

        else

        {

            pTemp=pTemp->pLeftChild;

        }

    }

    pNodeNew->pParent=pTempParent;

    if (pTempParent->data<x)

    {

        pTempParent->pRightChild=pNodeNew;

    }

    else

        pTempParent->pLeftChild=pNodeNew;

}

void Tree_Delete(Node* &tree,Node *p)//删除二叉排序树中一个节点

{

    if(p->pLeftChild==NULL&&p->pRightChild==NULL)//删除叶节点

    {

        Node *pParent=p->pParent;

        if (pParent)

        {

            if (pParent->data<p->data)

            {

                pParent->pRightChild=NULL;

            }

            else

                pParent->pLeftChild=NULL;

            free(p);

        } 

        else

        {

            tree=NULL;

            free(p);

        }

    }

    else if (p->pLeftChild&&p->pRightChild==NULL||p->pRightChild&&p->pLeftChild==NULL)//只有一个子树

    {

        Node *pParent=p->pParent;

        if (pParent)

        {

            if (pParent->data<p->data)//子树连到父节点的右孩子

            {

                if(p->pLeftChild)//哪个子树不为空连哪个

                {

                    pParent->pRightChild=p->pLeftChild;

                    p->pLeftChild->pParent=pParent;

                }

                else

                {

                    pParent->pRightChild=p->pRightChild;

                    p->pRightChild->pParent=pParent;

                }

                free(p);

            }

            else

            {

                if(p->pLeftChild)//哪个子树不为空连哪个

                {

                    pParent->pLeftChild=p->pLeftChild;

                    p->pLeftChild->pParent=pParent;

                }

                else

                {

                    pParent->pLeftChild=p->pRightChild;

                    p->pRightChild->pParent=pParent;

                }

                free(p);    

            }

        } 

        else

        {

            if(p->pLeftChild)

            {

                p->pLeftChild->pParent=NULL;

                tree=p->pLeftChild;

            }

            else

            {

                p->pRightChild->pParent=NULL;

                tree=p->pRightChild;

            }

            free(p);

        }

    }else//有两个子树

    {

        Node *temp=Tree_Maximum(p->pLeftChild);

        int x=p->data;p->data=temp->data;temp->data=x;

        Tree_Delete(tree,temp);

    }

}

void main()

{

    int array[]={15,6,3,2,0,0,4,0,0,7,0,13,9,0,0,0,18,17,0,0,20,0,0};

    Node *tree=Create_BTree(array);

    

    Tree_Insert(tree,21);

    Mid_Order(tree);

    cout<<endl;

    Node *temp=Tree_Search(tree,7);//查找

    Tree_Delete(tree,temp);

    Mid_Order(tree);

    cout<<endl;

    Destroy_BTree(tree);

}

你可能感兴趣的:(二叉排序树)