ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:18.84KB ,
资源ID:6643229      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6643229.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构B类红黑二叉树.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构B类红黑二叉树.docx

1、数据结构B类红黑二叉树#include#include#include#include#include #define TRUE 1#define BOOL int#define FALSE 0#define Status intenum color_t RED,BlACK;typedef struct RedBlackNode /红黑二叉树结构体 int data; char phone12; char name12; /数据域 color_t color; /颜色 RedBlackNode *left; /左孩子 RedBlackNode *right; /右孩子 RedBlackNode

2、 *parent; /父亲节点 RedBlackNode,*RBTree;typedef struct LinkStack RedBlackNode *rbtree; struct LinkStack *next;LinkStack;LinkStack * InitStack();Status StackEmpty(LinkStack *L);Status DestroyStack(LinkStack *L);Status StackLength(LinkStack *L);Status PushStack(LinkStack *L,RedBlackNode *r);RedBlackNode

3、* PopStack(LinkStack *L);RedBlackNode *RBserach(RedBlackNode *rbtree,int key);RedBlackNode *RBMinimum(RBTree *T);RedBlackNode *RBMaximum(RBTree *T);RedBlackNode *RBpioneer(RedBlackNode *T);RedBlackNode *RBsucceed(RedBlackNode *T);void left_rotate(RBTree *rbtree,RedBlackNode *T);void right_rotate(RBT

4、ree *retree,RedBlackNode *T);BOOL RBInsertNode(RBTree *T,int data);int RBDeleteNode(RBTree *T, int data);void RbTreeInsertAdjust(RBTree *T,RedBlackNode *p);void RbTreeDeleteAdjust(RBTree *T,RedBlackNode *parent,RedBlackNode *x);void Output(RedBlackNode *p);void PreorderTraverse(RedBlackNode *T);void

5、 InorderTraverse(RedBlackNode *T);void PostorderTraverse(RedBlackNode *T);int prerecursion(RedBlackNode *T);int inrecursion(RedBlackNode *T);int postrecursion(RedBlackNode *T);void menu1();void menu2();void logon();LinkStack * InitStack() LinkStack *L; L=(LinkStack *)malloc(sizeof(LinkStack); L-next

6、=NULL; return L;Status StackEmpty(LinkStack *L) if(L-next) return FALSE; else return TRUE; Status DestroyStack(LinkStack *L) LinkStack *p,*r,*q; p=L-next; r=L; if(p=NULL) return FALSE; while(p!=NULL) r-next=p-next; q=p; p=p-next; free(q); free(L); return TRUE;Status StackLength(LinkStack *L) int i=0

7、; LinkStack *p; p=L-next; if(L=NULL) return FALSE; while(p!=NULL) i+; p=p-next; return i;RedBlackNode *PopStack(LinkStack *L) LinkStack *p; RedBlackNode *q; p=L; while(p-next&p-next-next!=NULL) p=p-next; q=p-next-rbtree; p-next=NULL; return q;Status PushStack(LinkStack *L,RedBlackNode *r) LinkStack

8、*p,*stacknode=(LinkStack*)malloc(sizeof(LinkStack); p=L; while(p-next!=NULL) p=p-next; stacknode-rbtree=r; stacknode-next=NULL; p-next=stacknode; return TRUE;RedBlackNode *RBserach(RBTree *rbtree,int key) /查找值为key的节点 RedBlackNode *T; T=*rbtree; while(T!=NULL&T-data!=key) if(keydata) T=T-left; else T

9、=T-right; Output(T); return T;RedBlackNode *RBMinimum(RBTree *T) /返回红黑树局部最小值 RedBlackNode *curNode, *targetNode; curNode=*T; targetNode=NULL; if(curNode!=NULL) targetNode=curNode; curNode=curNode-left; return targetNode;RedBlackNode *RBMaximum(RBTree *T) /返回红黑树局部最大值 RedBlackNode *curNode, *targetNod

10、e; curNode=*T; targetNode=NULL; if(curNode!=NULL) targetNode=curNode; curNode=curNode-right; return targetNode;RedBlackNode *RBpioneer(RedBlackNode *T) /返回T的前驱 RedBlackNode *targetNode; RedBlackNode *P; P=NULL; if(T=NULL) return P; if(T-left!=NULL) targetNode=RBMaximum(&(T-left); else while(T-parent

11、!=NULL&T-parent-right!=T) T=T-parent; targetNode=T-parent; return targetNode;RedBlackNode *RBsucceed(RedBlackNode *T) /后继节点 RedBlackNode *targetNode; RedBlackNode *P; P=NULL; if(T=NULL) return P; if(T-right!=NULL) targetNode=RBMinimum(&(T-right); else while(T-parent!=NULL&T-parent-left!=T) T=T-paren

12、t; targetNode=T-parent; return targetNode;void left_rotate(RBTree *rbtree,RedBlackNode *T) /左旋 RedBlackNode *p; p=T-right; T-right=p-left; if(p-left!=NULL) p-left-parent=T; p-parent=T-parent; if(T-parent=NULL) *rbtree=p; else if(T-parent-left=T) T-parent-left=p; else T-parent-right=p; p-left=T; T-pa

13、rent=p;void right_rotate(RBTree *retree,RedBlackNode *T) RedBlackNode *p; p=T-left; T-left=p-right; if(p-right!=NULL) p-right-parent=T; p-parent=T-parent; if(T-parent=NULL) *retree=p; else if(T-parent-left=T) T-parent-left=p; else T-parent-right=p; p-right=T; T-parent=p;BOOL RBInsertNode(RBTree *T,i

14、nt data,char *name,char *phone) RedBlackNode *node,*p,*curNode; node=(RedBlackNode *)malloc(sizeof(RedBlackNode); if(node=NULL) return FALSE; node-data=data; strcpy(node-phone,phone); strcpy(node-name,name); node-color=RED; node-left=NULL; node-right=NULL; node-parent=NULL; curNode=*T; p=NULL; while

15、(curNode!=NULL) p=curNode; if(data data) curNode=curNode-left; else curNode=curNode-right; if(p=NULL) *T=node; else if(datadata) p-left=node; else p-right=node; node-parent=p; RbTreeInsertAdjust(T,node); return TRUE;int RBDeleteNode(RBTree *T, int data,char *name,char *phone) RedBlackNode *child,*ta

16、rget,*realdel; target= RBserach(T,data); if(target!=NULL) if(target-left=NULL|target-right=NULL) realdel=target; else realdel=RBsucceed(target); if(realdel-left!=NULL) child=realdel-left; else child=realdel-right; if(child!=NULL) child-parent=realdel-parent; if(realdel-parent=NULL) *T=child; else if

17、(realdel-parent-left=realdel) realdel-parent-left=child; else realdel-parent-right=child; if(target!=realdel) target-data=realdel-data; strcpy(target-phone,phone); strcpy(target-name,name); if(realdel-color=BlACK) RbTreeDeleteAdjust(T,realdel-parent,child); free(realdel); return TRUE; else return FA

18、LSE; void RbTreeInsertAdjust(RBTree *T,RedBlackNode *p) RedBlackNode *q,*uncle,*grandparent; while(q=p-parent)!=NULL&q-color=RED) grandparent=q-parent; if(q=grandparent-left) uncle=grandparent-right; if(uncle!=NULL&uncle-color=RED) grandparent-color=RED; q-color=BlACK; uncle-color=BlACK; p=grandpare

19、nt; else if(p=q-right) p=q; left_rotate(T,p); q=p-parent; else q-color=BlACK; grandparent-color=RED; right_rotate(T,grandparent); else uncle=grandparent-left; if(uncle!=NULL&uncle-color=RED) grandparent-color=RED; q-color=BlACK; uncle-color=BlACK; p=grandparent; else if(p=q-left) p=q; right_rotate(T

20、,p); q=p-parent; else q-color=BlACK; grandparent-color=RED; left_rotate(T,grandparent); (*T)-color=BlACK;void RbTreeDeleteAdjust(RBTree *T,RedBlackNode *parent,RedBlackNode *x) RedBlackNode *brother; while(x=NULL|x-color=BlACK)&x!=*T) if(x=parent-left) brother=parent-right; if(brother-color=RED) bro

21、ther-color=BlACK; parent-color=RED; left_rotate(T,parent); brother=parent-right; if(brother-left=NULL|brother-left-color=BlACK)& (brother-right=NULL|brother-right-color=BlACK) brother-color=RED; x=parent; parent=parent-parent; else if(brother-right=NULL|brother-color=BlACK) brother-left-color=BlACK;

22、 brother-color=RED; right_rotate(T,brother); brother=parent-right; brother-color=parent-color; parent-color=BlACK; brother-right-color=BlACK; left_rotate(T,parent); x=*T; else brother=parent-left; if(brother-color=RED) brother-color=BlACK; parent-color=RED; right_rotate(T,parent); brother=parent-lef

23、t; if(brother-right=NULL|brother-right-color=BlACK)& (brother-left=NULL|brother-left-color=BlACK) brother-color=RED; x=parent; parent=parent-parent; else if(brother-left=NULL|brother-left-color=BlACK) brother-right-color=BlACK; brother-color=RED; left_rotate(T,brother); brother=parent-left; brother-

24、color=parent-color; parent-color=BlACK; brother-left-color=BlACK; right_rotate(T,parent); x=*T; if(x!=NULL) x-color=BlACK; void Output(RedBlackNode *p) printf(data: %d, color: %s, parent: %d,name:%s,phone:%sn,p-data, (p-color = RED ? RED : BlACK), (p-parent != NULL) ? p-parent-data : -1,p-name,p-pho

25、ne); void PreorderTraverse(RedBlackNode *T) LinkStack *L=InitStack(); RedBlackNode *p; p=T; while (p | !StackEmpty(L) while (p) /遍历左子树 Output(p); PushStack(L,p); p=p-left; if (!StackEmpty(L) /通过下一次循环中的内嵌while实现右子树遍历 p=PopStack(L); p=p-right; void InorderTraverse(RedBlackNode *T) LinkStack *L; L=InitStack(); RedBlackNode *p; p=T; while (p!=NULL | !StackEmpty(L) while (p!=NULL) /遍历左子树 PushStack(L,p); p=p-left; if (!StackEmpty(L) p=PopStack(L); Output(p); /访问根结点 p=p-right; /通过下一次循环实现右子树遍历 DestroyStack(L);void PostorderTraverse(Red

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1