红黑树(插入与删除)


/**********************RBT.h************************/

                    /*头文件*/

typedef struct node{

char color;

int key;

struct node * p;

struct node *left;

struct node * right;

} Node;

void left_rotate(Node ** root,Node * x);

void right_rotate(Node ** root,Node * x);

void RB_insert(Node * *root,Node * z);

void RB_insert_fixup(Node ** root,Node * z);

void  Inorder_Tree_Walk(const Node * root);

void RB_transplant(Node **root,Node *u,Node *v);

Node * RB_minimum(Node * root);

void RB_delete(Node **root,Node *z);

void RB_delete_fixup(Node **root,Node *x);

Node * Tree_Search(Node *root,int k);




/********************RBT.c************************/

                /*函数文件*/

#include "RBT.h"

#include <stdio.h>

extern Node sential;

void left_rotate(Node ** root,Node * x)

{ Node *y=x->right;

x->right=y->left;

if(y->left!=&sential)

y->left->p=x;

y->p=x->p;

if(x->p==&sential)

*root=y;

else if(x==x->p->left)

x->p->left=y;

else

x->p->right=y;

y->left=x;

x->p=y;

}


void right_rotate(Node **root,Node * x) 

{       Node *y=x->left;

        x->left=y->right;

        if(y->right!=&sential)

                y->right->p=x;

y->p=x->p;

        if(x->p==&sential)

                *root=y;

        else if(x==x->p->right)

                x->p->right=y;

        else

                x->p->left=y;

        y->right=x;

        x->p=y;

}

void RB_insert(Node ** root,Node * z)

{ Node *x=*root;

Node *y=&sential;

while(x!=&sential)

{ y=x;

if(z->key<x->key)

x=x->left;

else

x=x->right;

}

if (y==&sential)

*root=z;

else if(z->key<y->key)

y->left=z;

else 

y->right=z;

z->p=y;

z->color='r';

z->left=&sential;

z->right=&sential;

RB_insert_fixup(root,z);

}


void RB_insert_fixup(Node ** root,Node * z)

{ while(z->p->color=='r')

{ if(z->p==z->p->p->left)

{ Node *y=z->p->p->right;

if(y->color=='r')

{ y->color='b';

z->p->color='b';

z->p->p->color='r';

z=z->p->p;

else

{ if (z==z->p->right)

{ z=z->p;

left_rotate(root,z);

}

right_rotate(root,z->p->p);

z->p->color='b';

z->p->right->color='r';

}

}

else

{ Node *y=z->p->p->left;

if(y->color=='r')

{ y->color='b';

z->p->color='b';

z->p->p->color='r';

z=z->p->p;

}

else

{ if(z==z->p->left)

{ z=z->p;

right_rotate(root,z);

}

left_rotate(root,z->p->p);

z->p->color='b';

z->p->left->color='r';

}

}

}

(*root)->color='b';

}

void  Inorder_Tree_Walk(const Node * root)

{ if( root!=&sential)

{

Inorder_Tree_Walk(root->left);

printf("%5d",root->key);

Inorder_Tree_Walk(root->right);

}

}

void RB_transplant(Node **root,Node *u,Node *v)

{ if(u->p==&sential)

*root=v;

else if(u->p->left==u)

u->p->left=v;

else

u->p->right=v;

v->p=u->p;

}





Node * RB_minimum(Node * root)

{ while(root->left!=&sential)

root=root->left;

return root;

}


void RB_delete(Node **root,Node *z)

{ Node *y=z;

Node *x;

char y_o_c=y->color;

if(z->left==&sential)

{ RB_transplant(root,z,z->right);

x=z->right;

}

else if(z->right==&sential)

{ RB_transplant(root,z,z->left);

x=z->left;

}

else

{ y=RB_minimum(z->right);

y_o_c=y->color;

x=y->right;

if(y->p==z)

x->p=y;

else

{ RB_transplant(root,y,x);

y->right=z->right;

y->right->p=y;


}

RB_transplant(root,z,y);

y->left=z->left;

y->left->p=y;

y->color=z->color;

}


if(y_o_c=='b')

RB_delete_fixup(root,x);

}




void RB_delete_fixup(Node **root,Node *x)

{ Node *w;

while(x->color=='b'&&x!=*root)

{ if(x==x->p->left)

{ w=x->p->right;

if(w->color=='r')

{ w->color='b';

x->p->color='r';

right_rotate(root,w);

w=x->p->right;

}

if(w->color=='b')

{ w->color='r';

x=x->p;

}

else 

{ if(w->right->color=='b')

{ w->left->color='b';

w->color='r';

right_rotate(root,w);

w=x->p->right;

}

w->color=w->p->color;

w->p->color='b';

w->right->color='b';

left_rotate(root,w->p);

x=*root;

}

}

else

{ w=x->p->left;

                        if(w->color=='r')

                        {       w->color='b';

                                x->p->color='r';

                                left_rotate(root,w);

                                w=x->p->left;

                        }

                        if(w->color=='b')

                        {       w->color='r';

                                x=x->p;

                        }

                        else

                        {       if(w->left->color=='b')

                                {       w->right->color='b';

                                        w->color='r';

                                        left_rotate(root,w);

                                        w=x->p->left;

                                }

                                w->color=w->p->color;

                                w->p->color='b';

                                w->left->color='b';

                                right_rotate(root,w->p);

                                x=*root;

                        }



}

}

}



Node * Tree_Search(Node *root,int k)

{ if (root==&sential||k==root->key)

return root;

if (k<root->key)

return Tree_Search(root->left,k);

else

return Tree_Search(root->right,k);

}

/************************drive_RBT.c*******************************/

                    /* 测试插入与删除函数*/

#include "RBT.h"

#include <stdio.h>

#include <stdlib.h>

Node sential={.color='b'};

int main(void)

{ Node * RBT_root=&sential;

int key;

printf("Please enter the key to insert(q to quit)\n");

while(scanf("%d",&key)==1)

{

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

p_node->key=key;

       RB_insert(&RBT_root,p_node);

}       

printf("Sorting\n");

Inorder_Tree_Walk(RBT_root);

putchar('\n');

printf("please enter the key you want delete\n");

while(getchar()!='\n')

continue;

int k;

scanf("%d",&k);

Node * res=Tree_Search(RBT_root,k);

if(res==NULL)

printf("%d is not in the BST\n",k);

RB_delete(&RBT_root,res);

printf("Now the RBT(after sorting)\n");

        Inorder_Tree_Walk(RBT_root);

putchar('\n');

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值