版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、平衡二叉树,(AVL树),(1)它左子树和右子树都是平衡二叉树,(2)左子树和右子树的深度之差的绝对值不超过1,定义: 平衡二叉树或者是一棵空树;或者是具有下列性质的排序二叉树,平衡因子=Height(T-lchild) - Height(T-rchild),俄国数学家 G.M.Adelson-Velskii 和 E.M. Landis, 1962年,1,1,0,0,-1,1,-1,0,1,0,2,-1,0,0,1,0,-1,0,-2,0,0,1,0,0,(13, 24, 37, 90, 53),平衡二叉树的生成过程,24,90,53,A,B,A,0,1,BL,BR,h,AR,h,h,LL平衡
2、旋转,单向右旋,树深度不变,树及右子树为平衡树,B,A,0,-1,BL,BR,h,AL,h,h,RR平衡旋转,A,单向左旋,树深度不变,树及左子树为平衡树,B,A,0,1,BL,h,AR,h,LR平衡旋转,C,0,C,CR,CL,h-1,A,B,A,0,-1,BR,h,AL,h,RL平衡旋转,C,0,CR,CL,h-1,A,C,B,A,0,1,BL,BR,h,AR,h,h,B,A,0,-1,BL,BR,h,AL,h,h,B,A,0,1,BL,h,AR,h,C,0,CR,CL,h-1,B,A,0,-1,BR,h,AL,h,C,0,CR,CL,h-1,LL,RR,LR,RL,1,2,-1,-2,1
3、,2,-1,-1,-2,1,LL,(13, 24, 37, 90, 53),平衡二叉树的生成过程,24,90,53,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,练习,根据下列序列构造平衡二叉树,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平衡二叉树的生成过程,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平衡二叉树的生成过程,45,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平衡二叉树的生成过程,45,45, 24, 53, 45
4、, 12, 24, 90, 99, 64, 72, 20,平衡二叉树的生成过程,45,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平衡二叉树的生成过程,45,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平衡二叉树的生成过程,45,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平衡二叉树的生成过程,45,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平衡二叉树的生成过程,45,45, 24, 53, 45, 12, 24, 90, 9
5、9, 64, 72, 20,平衡二叉树的生成过程,45,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平衡二叉树的生成过程,45,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平衡二叉树的生成过程,45,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平衡二叉树的生成过程,45,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平衡二叉树的生成过程,45,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平
6、衡二叉树的生成过程,45,24,90,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平衡二叉树的生成过程,45,20,90,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平衡二叉树的生成过程,45,20,90,1,-1,0,-1,2,-2,插入80,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平衡二叉树的生成过程,45,20,90,1,-1,0,-1,2,-2,LR,72,插入80,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平衡二
7、叉树的生成过程,45,20,-1,72,插入80,0,1,插入75,1,-1,-2,45, 24, 53, 45, 12, 24, 90, 99, 64, 72, 20,平衡二叉树的生成过程,45,20,72,90,64,插入80,插入75,A,B,A,0,1,BL,BR,h,AR,h,h,LL平衡旋转,lc=p-lchild,p-lchild=lc-rchild,lc-rchild=p,A,LL,void R_Rotate(BSTree /p指向新的根结点 ,LL平衡旋转,A,void R_Rotate(BSTree /p指向新的根结点 ,p,p,LL,A,B,A,BL,BR,AR,h+1,
8、h,h,0,0,void R_Rotate(BSTree /p指向新的根结点 ,p,lc,p,lc,LL,A,B,A,BL,BR,AR,h+1,h,h,0,0,void R_Rotate(BSTree /p指向新的根结点 ,p,lc,p,lc,LL,A,B,A,BL,BR,AR,h+1,h,h,0,0,void R_Rotate(BSTree /p指向新的根结点 ,p,lc,lc,LL,B,A,0,-1,BL,BR,h,AL,h,h,RR平衡旋转,A,rc=p-rchild,p-rchild=rc-lchild,rc-lchild=p,RR平衡旋转,A,RR,void L_Rotate(BST
9、ree /p指向新的根结点 ,RR平衡旋转,A,void L_Rotate(BSTree /p指向新的根结点 ,RR,RR平衡旋转,A,B,A,BR,AL,BL,h+1,h,h,0,0,void L_Rotate(BSTree /p指向新的根结点 ,RR,RR平衡旋转,A,B,A,BR,AL,BL,h+1,h,h,0,0,void L_Rotate(BSTree /p指向新的根结点 ,RR,RR平衡旋转,A,B,A,BR,AL,BL,h+1,h,h,0,0,void L_Rotate(BSTree /p指向新的根结点 ,RR,C,A,B,A,-1,BL,CR,h,AR,h,h-1,CL,1,h
10、,2,C,LR平衡旋转,LR平衡旋转,C,A,B,A,-1,BL,CR,h,AR,h,h-1,CL,1,h,2,C,lc=p-lchild,rd=lc-rchild,lc-rchild=rd-lchild,rd-lchild=lc,lc=rd,L-Rotate(p-lchild),LR平衡旋转,C,A,B,A,BL,CR,h,AR,h,h-1,CL,1,h,2,C,lc=p-lchild,rd=lc-lchild,L-Rotate(p-lchild),lc-rchild=p,p-lchild= lc-rchild,p=lc,R-Rotate(p),-1,LR平衡旋转,C,A,B,A,BL,CR
11、,h,AR,h,h-1,CL,1,h,2,C,lc=p-lchild,rd=lc-lchild,L-Rotate(p-lchild),R-Rotate(p),-1,B,1,2,BL,BR,h+1,AR,h,h,B,A,A,B,A,BL,BR,AR,h+1,h,h,0,0,LL,C,LR,A,B,-1,-2,BL,BR,h,AL,h,h+1,A,RR,h,B,A,1,-2,BR,h,AL,h,1,CR,CL,h-1,C,C,RL,typedef struct BSTNode ElemType data; int bf; /结点的平衡因子 BSTNode *lchild,*rchild; /左、右
12、孩子指针 BSTNode, *BSTree;,#define LH +1 / 左高 #define EH 0 / 等高 #define RH -1 / 右高,void LeftBalance(BSTree ,B,1,2,BL,BR,h+1,AR,h,h,B,A,A,B,A,BL,BR,AR,h+1,h,h,0,0,LL,case RH: / 新结点插入在T的左孩子的右子树上,要作双旋处理 rd=lc-rchild; / rd指向T的左孩子的右子树根 switch(rd-bf) / 修改T及其左孩子的平衡因子 case LH: T-bf=RH; lc-bf=EH; break; case EH:
13、 T-bf=lc-bf=EH; break; case RH: T-bf=EH; lc-bf=LH; break; /switch(rd-bf) rd-bf=EH; L_Rotate(T-lchild); R_Rotate(T); /switch(lc-bf) ,C,LR,case RH: / 新结点插入在T的左孩子的右子树上,要作双旋处理 rd=lc-rchild; / rd指向T的左孩子的右子树根 switch(rd-bf) / 修改T及其左孩子的平衡因子 case LH: T-bf=RH; lc-bf=EH; break; case EH: T-bf=lc-bf=EH; break; c
14、ase RH: T-bf=EH; lc-bf=LH; break; /switch(rd-bf) rd-bf=EH; L_Rotate(T-lchild); R_Rotate(T); /switch(lc-bf) ,C,LR,case RH: / 新结点插入在T的左孩子的右子树上,要作双旋处理 rd=lc-rchild; / rd指向T的左孩子的右子树根 switch(rd-bf) / 修改T及其左孩子的平衡因子 case LH: T-bf=RH; lc-bf=EH; break; case EH: T-bf=lc-bf=EH; break; case RH: T-bf=EH; lc-bf=L
15、H; break; /switch(rd-bf) rd-bf=EH; L_Rotate(T-lchild); R_Rotate(T); /switch(lc-bf) ,C,LR,case RH: / 新结点插入在T的左孩子的右子树上,要作双旋处理 rd=lc-rchild; / rd指向T的左孩子的右子树根 switch(rd-bf) / 修改T及其左孩子的平衡因子 case LH: T-bf=RH; lc-bf=EH; break; case EH: T-bf=lc-bf=EH; break; case RH: T-bf=EH; lc-bf=LH; break; /switch(rd-bf)
16、 rd-bf=EH; L_Rotate(T-lchild); R_Rotate(T); /switch(lc-bf) ,C,LR,case RH: / 新结点插入在T的左孩子的右子树上,要作双旋处理 rd=lc-rchild; / rd指向T的左孩子的右子树根 switch(rd-bf) / 修改T及其左孩子的平衡因子 case LH: T-bf=RH; lc-bf=EH; break; case EH: T-bf=lc-bf=EH; break; case RH: T-bf=EH; lc-bf=LH; break; /switch(rd-bf) rd-bf=EH; L_Rotate(T-lc
17、hild); R_Rotate(T); /switch(lc-bf) ,C,B,A,-1,BL,CR,h,AR,h,h,CL,0,h,2,C,C,A,BL,AR,h,0,0,B,h,0,LR,CR,CL,case RH: / 新结点插入在T的左孩子的右子树上,要作双旋处理 rd=lc-rchild; / rd指向T的左孩子的右子树根 switch(rd-bf) / 修改T及其左孩子的平衡因子 case LH: T-bf=RH; lc-bf=EH; break; case EH: T-bf=lc-bf=EH; break; case RH: T-bf=EH; lc-bf=LH; break; /
18、switch(rd-bf) rd-bf=EH; L_Rotate(T-lchild); R_Rotate(T); /switch(lc-bf) ,C,B,A,-1,BL,CR,h,AR,h,h-1,CL,1,h,2,C,C,A,BL,AR,h,0,0,B,CL,h,CR,1,LR,h,case RH: / 新结点插入在T的左孩子的右子树上,要作双旋处理 rd=lc-rchild; / rd指向T的左孩子的右子树根 switch(rd-bf) / 修改T及其左孩子的平衡因子 case LH: T-bf=RH; lc-bf=EH; break; case EH: T-bf=lc-bf=EH; br
19、eak; case RH: T-bf=EH; lc-bf=LH; break; /switch(rd-bf) rd-bf=EH; L_Rotate(T-lchild); R_Rotate(T); /switch(lc-bf) ,C,B,A,-1,BL,CR,h,AR,h,h-1,CL,1,h,2,C,C,A,BL,AR,h,0,0,B,CL,h,CR,1,LR,h,Status InsertAVL(BSTree / 否则,应继续在*T的左子树中进行搜索,if LT(e.key, T-data.key) / 应继续在T的左子树中进行搜索 if(!InsertAVL(T-lchild,e,tall
20、er) return FALSE; / 未插入 if(taller) /已插入到T的左子树中且左子树“长高” switch(T-bf) / 检查T的平衡度 case LH: /原本左子树比右子树高,需要作左平衡处理 LeftBalance(T); taller=FALSE; break; case EH: /原本左、右子树等高,现因左子树增高而使树增高 T-bf=LH; taller=TRUE; break; case RH: T-bf=EH; /原本右子树比左子树高,现左、右子树等高 taller=FALSE; break; else(转下页) / 应继续在*T的右子树中进行搜索,BL,BR
21、,B,T,h,A,AR,if LT(e.key, T-data.key) / 应继续在T的左子树中进行搜索 if(!InsertAVL(T-lchild,e,taller) return FALSE; / 未插入 if(taller) /已插入到T的左子树中且左子树“长高” switch(T-bf) / 检查T的平衡度 case LH: /原本左子树比右子树高,需要作左平衡处理 LeftBalance(T); taller=FALSE; break; case EH: /原本左、右子树等高,现因左子树增高而使树增高 T-bf=LH; taller=TRUE; break; case RH: T
22、-bf=EH; /原本右子树比左子树高,现左、右子树等高 taller=FALSE; break; else(转下页) / 应继续在*T的右子树中进行搜索,BL,BR,B,T,h,A,AR,if LT(e.key, T-data.key) / 应继续在T的左子树中进行搜索 if(!InsertAVL(T-lchild,e,taller) return FALSE; / 未插入 if(taller) /已插入到T的左子树中且左子树“长高” switch(T-bf) / 检查T的平衡度 case LH: /原本左子树比右子树高,需要作左平衡处理 LeftBalance(T); taller=FAL
23、SE; break; case EH: /原本左、右子树等高,现因左子树增高而使树增高 T-bf=LH; taller=TRUE; break; case RH: T-bf=EH; /原本右子树比左子树高,现左、右子树等高 taller=FALSE; break; else(转下页) / 应继续在T的右子树中进行搜索,BL,BR,B,T,h,A,1,AR,if LT(e.key, T-data.key) / 应继续在T的左子树中进行搜索 if(!InsertAVL(T-lchild,e,taller) return FALSE; / 未插入 if(taller) /已插入到T的左子树中且左子树
24、“长高” switch(T-bf) / 检查T的平衡度 case LH: /原本左子树比右子树高,需要作左平衡处理 LeftBalance(T); taller=FALSE; break; case EH: /原本左、右子树等高,现因左子树增高而使树增高 T-bf=LH; taller=TRUE; break; case RH: T-bf=EH; /原本右子树比左子树高,现左、右子树等高 taller=FALSE; break; else(转下页) / 应继续在T的右子树中进行搜索,BL,BR,B,T,h,A,1,AR,if LT(e.key, T-data.key) / 应继续在T的左子树中
25、进行搜索 if(!InsertAVL(T-lchild,e,taller) return FALSE; / 未插入 if(taller) /已插入到T的左子树中且左子树“长高” switch(T-bf) / 检查T的平衡度 case LH: /原本左子树比右子树高,需要作左平衡处理 LeftBalance(T); taller=FALSE; break; case EH: /原本左、右子树等高,现因左子树增高而使树增高 T-bf=LH; taller=TRUE; break; case RH: T-bf=EH; /原本右子树比左子树高,现左、右子树等高 taller=FALSE; break;
26、 else(转下页) / 应继续在T的右子树中进行搜索,BL,BR,B,T,h,A,1,AR,if LT(e.key, T-data.key) / 应继续在T的左子树中进行搜索 if(!InsertAVL(T-lchild,e,taller) return FALSE; / 未插入 if(taller) /已插入到T的左子树中且左子树“长高” switch(T-bf) / 检查T的平衡度 case LH: /原本左子树比右子树高,需要作左平衡处理 LeftBalance(T); taller=FALSE; break; case EH: /原本左、右子树等高,现因左子树增高而使树增高 T-bf
27、=LH; taller=TRUE; break; case RH: T-bf=EH; /原本右子树比左子树高,现左、右子树等高 taller=FALSE; break; else(转下页) / 应继续在T的右子树中进行搜索,BL,BR,B,T,h,A,0,AR,if LT(e.key, T-data.key) / 应继续在T的左子树中进行搜索 if(!InsertAVL(T-lchild,e,taller) return FALSE; / 未插入 if(taller) /已插入到T的左子树中且左子树“长高” switch(T-bf) / 检查T的平衡度 case LH: /原本左子树比右子树高
28、,需要作左平衡处理 LeftBalance(T); taller=FALSE; break; case EH: /原本左、右子树等高,现因左子树增高而使树增高 T-bf=LH; taller=TRUE; break; case RH: T-bf=EH; /原本右子树比左子树高,现左、右子树等高 taller=FALSE; break; else(转下页) / 应继续在T的右子树中进行搜索,BL,BR,B,T,h,A,0,1,AR,if LT(e.key, T-data.key) / 应继续在T的左子树中进行搜索 if(!InsertAVL(T-lchild,e,taller) return F
29、ALSE; / 未插入 if(taller) /已插入到T的左子树中且左子树“长高” switch(T-bf) / 检查T的平衡度 case LH: /原本左子树比右子树高,需要作左平衡处理 LeftBalance(T); taller=FALSE; break; case EH: /原本左、右子树等高,现因左子树增高而使树增高 T-bf=LH; taller=TRUE; break; case RH: T-bf=EH; /原本右子树比左子树高,现左、右子树等高 taller=FALSE; break; else(转下页) / 应继续在T的右子树中进行搜索,BL,BR,B,T,h,A,-1,A
30、R,if LT(e.key, T-data.key) / 应继续在T的左子树中进行搜索 if(!InsertAVL(T-lchild,e,taller) return FALSE; / 未插入 if(taller) /已插入到T的左子树中且左子树“长高” switch(T-bf) / 检查T的平衡度 case LH: /原本左子树比右子树高,需要作左平衡处理 LeftBalance(T); taller=FALSE; break; case EH: /原本左、右子树等高,现因左子树增高而使树增高 T-bf=LH; taller=TRUE; break; case RH: T-bf=EH; /原
31、本右子树比左子树高,现左、右子树等高 taller=FALSE; break; else(转下页) / 应继续在T的右子树中进行搜索,BL,BR,B,T,h,A,-1,0,AR,else / 应继续在T的右子树中进行搜索 if(!InsertAVL(T-rchild,e,taller) return FALSE; / 未插入 if(taller) /已插入到T的右子树且右子树“长高” switch(T-bf) /检查T的平衡度 case LH: /原本左子树比右子树高,现左、右子树等高 T-bf=EH; taller=FALSE; break; case EH: /原本左、右子树等高,现因右子
32、树增高而使树增高 T-bf=RH; taller=TRUE; break; case RH: /原本右子树比左子树高,需要作右平衡处理 RightBalance(T); taller=FALSE; / switch(T-bf) / if(taller) /else return TRUE; ,BL,BR,B,T,h,A,1,AL,else / 应继续在T的右子树中进行搜索 if(!InsertAVL(T-rchild,e,taller) return FALSE; / 未插入 if(taller) /已插入到T的右子树且右子树“长高” switch(T-bf) /检查T的平衡度 case LH
33、: /原本左子树比右子树高,现左、右子树等高 T-bf=EH; taller=FALSE; break; case EH: /原本左、右子树等高,现因右子树增高而使树增高 T-bf=RH; taller=TRUE; break; case RH: /原本右子树比左子树高,需要作右平衡处理 RightBalance(T); taller=FALSE; / switch(T-bf) / if(taller) /else return TRUE; ,BL,BR,B,T,h,A,1,AL,else / 应继续在T的右子树中进行搜索 if(!InsertAVL(T-rchild,e,taller) re
34、turn FALSE; / 未插入 if(taller) /已插入到T的右子树且右子树“长高” switch(T-bf) /检查T的平衡度 case LH: /原本左子树比右子树高,现左、右子树等高 T-bf=EH; taller=FALSE; break; case EH: /原本左、右子树等高,现因右子树增高而使树增高 T-bf=RH; taller=TRUE; break; case RH: /原本右子树比左子树高,需要作右平衡处理 RightBalance(T); taller=FALSE; / switch(T-bf) / if(taller) /else return TRUE;
35、,BL,BR,B,T,h,A,1,AL,else / 应继续在T的右子树中进行搜索 if(!InsertAVL(T-rchild,e,taller) return FALSE; / 未插入 if(taller) /已插入到T的右子树且右子树“长高” switch(T-bf) /检查T的平衡度 case LH: /原本左子树比右子树高,现左、右子树等高 T-bf=EH; taller=FALSE; break; case EH: /原本左、右子树等高,现因右子树增高而使树增高 T-bf=RH; taller=TRUE; break; case RH: /原本右子树比左子树高,需要作右平衡处理 R
36、ightBalance(T); taller=FALSE; / switch(T-bf) / if(taller) /else return TRUE; ,BL,BR,B,T,h,A,1,AL,else / 应继续在T的右子树中进行搜索 if(!InsertAVL(T-rchild,e,taller) return FALSE; / 未插入 if(taller) /已插入到T的右子树且右子树“长高” switch(T-bf) /检查T的平衡度 case LH: /原本左子树比右子树高,现左、右子树等高 T-bf=EH; taller=FALSE; break; case EH: /原本左、右子
37、树等高,现因右子树增高而使树增高 T-bf=RH; taller=TRUE; break; case RH: /原本右子树比左子树高,需要作右平衡处理 RightBalance(T); taller=FALSE; / switch(T-bf) / if(taller) /else return TRUE; ,BL,BR,B,T,h,A,1,AL,else / 应继续在T的右子树中进行搜索 if(!InsertAVL(T-rchild,e,taller) return FALSE; / 未插入 if(taller) /已插入到T的右子树且右子树“长高” switch(T-bf) /检查T的平衡度
38、 case LH: /原本左子树比右子树高,现左、右子树等高 T-bf=EH; taller=FALSE; break; case EH: /原本左、右子树等高,现因右子树增高而使树增高 T-bf=RH; taller=TRUE; break; case RH: /原本右子树比左子树高,需要作右平衡处理 RightBalance(T); taller=FALSE; / switch(T-bf) / if(taller) /else return TRUE; ,BL,BR,B,T,h,A,1,AL,0,else / 应继续在T的右子树中进行搜索 if(!InsertAVL(T-rchild,e,
39、taller) return FALSE; / 未插入 if(taller) /已插入到T的右子树且右子树“长高” switch(T-bf) /检查T的平衡度 case LH: /原本左子树比右子树高,现左、右子树等高 T-bf=EH; taller=FALSE; break; case EH: /原本左、右子树等高,现因右子树增高而使树增高 T-bf=RH; taller=TRUE; break; case RH: /原本右子树比左子树高,需要作右平衡处理 RightBalance(T); taller=FALSE; / switch(T-bf) / if(taller) /else ret
40、urn TRUE; ,BL,BR,B,T,h,A,0,AL,else / 应继续在T的右子树中进行搜索 if(!InsertAVL(T-rchild,e,taller) return FALSE; / 未插入 if(taller) /已插入到T的右子树且右子树“长高” switch(T-bf) /检查T的平衡度 case LH: /原本左子树比右子树高,现左、右子树等高 T-bf=EH; taller=FALSE; break; case EH: /原本左、右子树等高,现因右子树增高而使树增高 T-bf=RH; taller=TRUE; break; case RH: /原本右子树比左子树高,
41、需要作右平衡处理 RightBalance(T); taller=FALSE; / switch(T-bf) / if(taller) /else return TRUE; ,BL,BR,B,T,h,A,0,AL,1,else / 应继续在T的右子树中进行搜索 if(!InsertAVL(T-rchild,e,taller) return FALSE; / 未插入 if(taller) /已插入到T的右子树且右子树“长高” switch(T-bf) /检查T的平衡度 case LH: /原本左子树比右子树高,现左、右子树等高 T-bf=EH; taller=FALSE; break; case
42、 EH: /原本左、右子树等高,现因右子树增高而使树增高 T-bf=RH; taller=TRUE; break; case RH: /原本右子树比左子树高,需要作右平衡处理 RightBalance(T); taller=FALSE; / switch(T-bf) / if(taller) /else return TRUE; ,BL,BR,B,T,h,A,-1,AL,else / 应继续在T的右子树中进行搜索 if(!InsertAVL(T-rchild,e,taller) return FALSE; / 未插入 if(taller) /已插入到T的右子树且右子树“长高” switch(T
43、-bf) /检查T的平衡度 case LH: /原本左子树比右子树高,现左、右子树等高 T-bf=EH; taller=FALSE; break; case EH: /原本左、右子树等高,现因右子树增高而使树增高 T-bf=RH; taller=TRUE; break; case RH: /原本右子树比左子树高,需要作右平衡处理 RightBalance(T); taller=FALSE; / switch(T-bf) / if(taller) /else return TRUE; ,BL,BR,B,T,h,A,-1,AL,-2,else / 应继续在T的右子树中进行搜索 if(!Insert
44、AVL(T-rchild,e,taller) return FALSE; / 未插入 if(taller) /已插入到T的右子树且右子树“长高” switch(T-bf) /检查T的平衡度 case LH: /原本左子树比右子树高,现左、右子树等高 T-bf=EH; taller=FALSE; break; case EH: /原本左、右子树等高,现因右子树增高而使树增高 T-bf=RH; taller=TRUE; break; case RH: /原本右子树比左子树高,需要作右平衡处理 RightBalance(T); taller=FALSE; / switch(T-bf) / if(ta
45、ller) /else return TRUE; ,BL,BR,B,T,h,A,1,AL,平衡二叉树的查找分析,n,hmax=?,h,nmin =?,0,0,1,1,2,2,3,4,4,45,12,53,5,37,61,24,99,47,7,Nh=Nh-1+Nh-2+1,h,Nh ?,Nh=Nh-1+Nh-2+1,Nh=Fh+2 - 1,Nh=Fh+2 - 1,含有n个结点的平衡二叉树的最大深度,思考题,45,12,53,5,37,61,24,99,90,78,(3)如何判定一棵给定的二叉树是否是平衡二叉树,写出相应的算法,(1)如何输出二叉树排序树中的最大元素和最小元素? (2)如何判定一棵
46、给定的二叉树是否是排序二叉树,写出相应的算法,思考题,Status JudgeBBST(BiTree T) if(!T) return 1; else a=JudgeBBST(T-lchild); b=JudgeBBST(T-rchild); k=BiTreeDepth(T-lchild) - BiTreeDepth(T-rchild); if(a=1 /else /JudgeBBST,思考题,int PingHeng (BiTree T) if(flag=YES) if(T=NULL) return 0; else l=PingHeng(T-lchild); r=PingHeng(T-rch
47、ild); if(abs(l-r) flag=NO; else flag=YES; return max(l,r)+1; return -1; /else else return -1; /else /PingHeng,flag为全局变量, 调用函数PingHeng(root, flag)后, 如果 flag=Yes, 则为平衡二叉树。,思考题,int JudgeBST (BiTree bt) int b1, b2; if(bt=NULL) return 1; else b1=JudgeBST(bt-lchild); if(b1=0| predt=bt-data) return 0; pred
48、t=bt-data; b2=JudgeBST(bt-rchild); return b2; ,predt为保存当前结点中序遍历的前趋值,故只要始终保持前一个元素的值比后一个元素的值大,即可判断这是一棵平衡二叉树。,45,12,53,5,37,61,24,99,90,78,思考题,45,12,53,5,37,61,24,99,90,78,int IsSortBiTree(BSTree T, int ,思考题,45,12,53,5,37,61,24,99,90,78,int IsAVL_Tree(BSTree T, int ,思考题,45,12,53,5,37,61,24,99,90,78,fla
49、g(1) = 1,1,int IsAVL_Tree(BSTree T, int ,思考题,45,12,53,5,37,61,24,99,90,78,T(1),flag(1) = 1,1,int IsAVL_Tree(BSTree T, int ,思考题,45,12,53,5,37,61,24,99,90,78,T(1),flag(1) = 1,1,int IsAVL_Tree(BSTree T, int ,思考题,45,12,53,5,37,61,24,99,90,78,T(1),flag(1) = 1,1,int IsAVL_Tree(BSTree T, int ,h1(1) = ?,h2(
50、1) =?,思考题,45,12,53,5,37,61,24,99,90,78,T(1),flag(2) = 1,2,int IsAVL_Tree(BSTree T, int ,h1(2) = ?,h2(2) =?,思考题,45,12,53,5,37,61,24,99,90,78,T(1),flag(2) = 1,2,T(2),int IsAVL_Tree(BSTree T, int ,h1(2) = ?,h2(2) =?,思考题,45,12,53,5,37,61,24,99,90,78,T(1),flag(2) = 1,2,T(2),int IsAVL_Tree(BSTree T, int ,
51、h1(2) = ?,h2(2) =?,思考题,45,12,53,5,37,61,24,99,90,78,T(1),flag(2) = 1,2,T(2),int IsAVL_Tree(BSTree T, int ,h1(2) = ?,h2(2) =?,思考题,flag(3) = 1,3,int IsAVL_Tree(BSTree T, int ,45,12,53,5,37,61,24,99,90,78,T(1),T(2),h1(3) = ?,h2(3) =?,思考题,45,12,53,5,37,61,24,99,90,78,T(1),flag(3) = 1,3,T(2),T(3),int IsAVL_Tree(BSTree T, int ,h1(3) = ?,h2(3) =?,思考题,45,12,53,5,37,61,24,99,90,78,T(1),flag(3) = 1,3,T(2),T(3),int IsAVL_Tree(BSTree T, int ,h1(3) = ?,h2(3) =?,思考题,45,12,53,5,37,61,24,99,90,78,T(1),flag(3) = 1,3,T(2),T(3),i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年幼儿园防陌生人安全教育
- 女士内衣市场投资前景分析及供需格局研究研究报告
- 幼儿园教学反思的重要意义
- 鸡西市恒山区2025届数学三年级下学期期中综合测试模拟试题(含解析)
- 2026年幼儿园大班数学6的分解
- 干细胞治疗标准化体系建设与行业规范发展路径
- 2026年幼儿园线上教育家长会
- 2026年幼儿园在走廊和楼梯上安全
- 2026年幼儿园的邀请朋友到我家的课件
- 2025-2030也门港口运营恢复计划与红海航运安全合作机制报告
- 汽修厂安全培训教案课件
- 学堂在线 现代生活美学-花香茶之道 章节测试答案
- 无线网络技术导论(第3版)
- 具身智能机器人生产线项目可行性研究报告
- DB44T 1216-2013 利用扫描电子显微术和X射线能谱法表征石墨烯的特性
- 教育数字化转型背景下职业教育人才培养模式改革
- (高清版)DG∕TJ 08-2314-2020 建筑同层排水系统应用技术标准
- 2025年第三届全国技能大赛竞赛(餐厅服务赛项)省选拔赛考试题库(含答案)
- 2025年安徽九华山旅游发展股份有限公司招聘66人笔试参考题库附带答案详解
- 交通设计(Traffic Design)知到智慧树章节测试课后答案2024年秋同济大学
- 2025年江苏江南水务股份有限公司招聘笔试参考题库含答案解析
评论
0/150
提交评论