• 二叉排序树的相关操作


    #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);
    }
  • 相关阅读:
    Apache RocketMQ + Hudi 快速构建 Lakehouse
    如何快速调度 PTS 的百万并发能力
    flask
    第三方登录————微博
    python定时获取树莓派硬件参数并使用MQTT进行数据推送
    树莓派修改时区
    windows编辑shell,报错syntax error near unexpected token `elif'
    树莓派挂载移动硬盘
    关闭树莓派摄像头红色LED指示灯
    树莓派拍照和录制视频
  • 原文地址:https://www.cnblogs.com/GoAhead/p/2741508.html
Copyright © 2020-2023  润新知