1130310126李明远第五章作业与练习.docx
- 文档编号:4008937
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:22
- 大小:18.32KB
1130310126李明远第五章作业与练习.docx
《1130310126李明远第五章作业与练习.docx》由会员分享,可在线阅读,更多相关《1130310126李明远第五章作业与练习.docx(22页珍藏版)》请在冰豆网上搜索。
1130310126李明远第五章作业与练习
第五章作业与练习
五.算法设计(作业,必须交)
1.设计算法判断一棵二叉树是否为二叉排序树。
flag=1代表是,flag=0代表否
使用dfs判断
#include
#include
structnode
{
intdata;
node*left;
node*right;
};
flag=1;
voiddfs(node*po)
{
if(po==NULL)
return;
if(po->left!
=NULL&&po->left->data>=po->data)
{
flag=0;
return;
}
if(po->right!
=NULL&&po->right->data<=po->data)
{
flag=0;
return;
}
dfs(po->left);
dfs(po->right);
return;
}
2.设计算法判断一棵二叉排序树是否是平衡二叉树。
如果任意节点的左右子树的深度相差不超过1,那这棵树就是平衡二叉树
首先编写一个计算二叉树深度的函数,然后通过递归判断是否为平衡二叉树
//计算二叉树的深度
structnode
{
intdata;
node*left;
node*right;
}BSTreeNode;
staticintDepth(BSTreeNode*pbs)
{
if(pbs==NULL)
return0;
else
{
intld=Depth(pbs->left);
intrd=Depth(pbs->right);
return1+(ld>rd?
ld:
rd);
}
}
//利用递归判断左右子树的深度是否相差1来判断是否是平衡二叉树
staticboolisBalance(BSTreeNode*pbs)
{
if(pbs==NULL)
returntrue;
intdis=Depth(pbs->left)-Depth(pbs->right);
if(dis>1||dis<-1)
returnfalse;
else
returnisBalance(pbs->left)&&isBalance(pbs->right);
}
3.实现平衡二叉树的插入和删除操作。
#include"avl_tree.h"
#include
#include
#include
#include
voidinsert_keys_to_AVL(AVLTree&tree,intkeys[],intn)
{
inttaller=FALSE;//此初值无影响
for(inti=0;i { insert_key_to_AVL(tree,keys[i],taller); } } intinsert_key_to_AVL(AVLTree&tree,intkey,int&taller) { if(! tree) {//插入新结点,如插入根结点,或叶子结点时(p->left=tree==null),且长高~ tree=(AVLTree)malloc(TNODE_SIZE); tree->key=key; tree->left=tree->right=NULL; tree->bf=EH; taller=TRUE; } else {//当插入新结点之后,对于tree进行平衡处理 if(EQ(key,tree->key)) {//存在相同关键字,不需要进行插入 taller=FALSE; return0; } elseif(LT(key,tree->key)) {//插入到左子树当中 //如果由于已经存在相同关键字而没有成功插入到树当中~ if(! insert_key_to_AVL(tree->left,key,taller)) return0; if(taller)//如果左子树变高了 { switch(tree->bf) { //如果左子树已经高1~,则需将左子树平衡~ caseLH: left_ballance(tree);taller=FALSE;break; caseEH: tree->bf=LH;taller=TRUE;break; caseRH: tree->bf=EH;taller=FALSE;break; }//switch(tree->bf) } } else {//右子树增高 //如果由于已经存在相同关键字而没有成功插入到树当中~ if(! insert_key_to_AVL(tree->right,key,taller)) return0; if(taller)//如果右子树变高了 { switch(tree->bf) { caseLH: tree->bf=EH;taller=FALSE;break; caseEH: //如果原左右子树相等,则左子树增加1,使得树“长高” tree->bf=RH;taller=TRUE;break; caseRH: //如果右子树已经高1~,现在又高1,则需将右子树平衡~ right_ballance(tree);taller=FALSE;break; }//switch(tree->bf) } } } return1; } voidleft_ballance(AVLTree&tree) { PTNodelc,lrc; lc=tree->left; switch(lc->bf) { caseEH: tree->bf=LH;lc->bf=RH;R_Rote(tree);break; caseLH: tree->bf=lc->bf=EH;R_Rote(tree);break; caseRH: lrc=tree->left->right; switch(lrc->bf) { caseLH: lc->bf=EH;tree->bf=RH;break; caseEH: lc->bf=tree->bf=EH;break; caseRH: tree->bf=EH;lc->bf=LH;break; }//switch(lrc->bf) lrc->bf=EH; L_Rote(tree->left);//不可以写成L_Rote(lrc);为什么? 因为若为此,则改变的是lrc指针变量的值,而非tree->left. R_Rote(tree); break; }//switch(left->bf) } voidright_ballance(AVLTree&tree) { PTNoderc,rlc;//rc为tree的右结点,rlc为rc的左结点 rc=tree->right; switch(rc->bf) { caseEH: tree->bf=RH;rc->bf=LH;L_Rote(tree);break; caseRH: tree->bf=rc->bf=EH;L_Rote(tree);break; caseLH: rlc=rc->left; switch(rlc->bf) { caseLH: tree->bf=EH;rc->bf=RH;break; caseEH: tree->bf=rc->bf=EH;break; caseRH: tree->bf=LH;rc=EH;break; } rlc->bf=EH; R_Rote(tree->right); L_Rote(tree); break; } } voidR_Rote(AVLTree&tree) { PTNodelc; lc=tree->left; tree->left=lc->right; lc->right=tree; tree=lc; } voidL_Rote(AVLTree&tree) { PTNoderc; rc=tree->right; tree->right=rc->left; rc->left=tree; tree=rc; } intdelete_key_from_AVL(AVLTree&tree,intkey,int&lower) { PTNodep,q=NULL;//删除结点~ inttarg=0;//标志位,即删除左结点或右结点~ intreturn_flag=0; if(! tree) {//可能出现删除叶子为空的情况不? return0; } if(EQ(key,tree->key)) {//如果为要删除结点,~ lower=TRUE;//即找到所要删除结点,致标识为TRUE~ if(NULL==tree->right) {//如果没有右节点 p=tree; tree=tree->left; free(p); return1;//原tree左子树平衡,无需调整~ } else { p=tree->right; while(p->left! =NULL) {//找到tree的右子树的最左结点~ p=p->left; } tree->key=p->key; return_flag=delete_key_from_AVL(tree->right,p->key,lower); targ=RH; } } elseif(LT(key,tree->key)) { return_flag=delete_key_from_AVL(tree->left,key,lower); targ=LH; } else { return_flag=delete_key_from_AVL(tree->right,key,lower); targ=RH; } //保证存在过为key的结点~ if(TRUE==lower) { if(targ==LH) {//删除的是左子树 switch(tree->bf) { caseLH: //由于原来左右高度分别为h、h-1,现在左子树删除,则 tree->bf=EH;lower=TRUE;break; caseEH: tree->bf=RH;lower=FALSE;break; caseRH: //如果原右子树已比左子树高1~,现在又删左子树,将导致不平衡~ right_ballance(tree);lower=TRUE;break; }//switch(tree->bf) } else {//删除的是右子树 switch(tree->bf) { caseLH: left_ballance(tree);lower=TRUE;break; caseEH: tree->bf=LH;lower=FALSE;break; caseRH: tree->bf=EH;lower=TRUE;break; }//switch(tree->bf) } }//if(TRUE==lower) returnreturn_flag; } voidvist_tree_in_first(constAVLTreetree) { if(NULL==tree) return; printf("%-4d",tree->key); vist_tree_in_first(tree->left); vist_tree_in_first(tree->right); } voiddestroy_tree(AVLTreetree) { if(! tree) return; destroy_tree(tree->left); destroy_tree(tree->right); free(tree); tree=NULL; } 4.实现B-树的插入和删除操作。 #definet2 #include #include structnode { intnum; intleaf; intkeys[2*t-1]; structnode*children[2*t]; }; structnode*root; intindex; voidb_tree_create(void); voidb_tree_spilt_child(structnode*,int,structnode*); voidb_tree_insert(int); voidb_tree_walk(structnode*); structnode*b_tree_search(structnode*,int); intb_tree_delete(structnode*,int); #include main() { inti; structnode*m; clrscr(); b_tree_create(); b_tree_insert (2); b_tree_insert(8); b_tree_insert(7); b_tree_insert (1); b_tree_insert(3); b_tree_insert(5); b_tree_insert(6); b_tree_insert(4); b_tree_walk(root); if(b_tree_delete(root,8)==1)printf("ok"); elseprintf("no"); b_tree_walk(root); } intb_tree_delete(structnode*x,intk) { inti; intj; i=0; while(i<=x->num-1&&k>x->keys[i]) { i++; } if(i<=x->num-1&&k==x->keys[i]) { if(x->leaf) { for(j=i+1;j<=x->num-1;j++) { x->keys[j-1]=x->keys[j]; } x->num--; return1; } else { structnode*y; structnode*z; y=x->children[i]; z=x->children[i+1]; if(y->num>=t) { x->keys[i]=y->keys[y->num-1]; b_tree_delete(y,y->keys[y->num-1]); } elseif(z->num>=t) { x->keys[i]=z->keys[0]; b_tree_delete(z,z->keys[0]); } else { y->keys[y->num]=x->keys[i]; y->num++; for(j=0;j<=t-2;j++) { y->keys[y->num+j]=z->keys[j]; } y->num=y->num+t-1; for(j=i+1;j<=x->num-1;j++) { x->keys[j-1]=x->keys[j]; x->children[j]=x->children[j+1]; } x->num--; b_tree_delete(y,k); } } } elseif(! x->leaf) { structnode*c; structnode*l; structnode*r; c=x->children[i]; if(i>=1)l=x->children[i-1]; elsel=NULL; if(i<=x->num-1)r=x->children[i+1]; elser=NULL; if(c->num==t-1) { if(l! =NULL&&l->num>=t) { for(j=t-1;j>=1;j--) { c->keys[j]=c->keys[j-1]; } c->keys[0]=x->keys[i-1]; if(! c->leaf) { for(j=t;j>=1;j--) { c->children[j]=c->children[j-1]; } } c->children[0]=l->children[l->num]; c->num++; x->keys[i-1]=l->keys[l->num-1]; l->num--; b_tree_delete(c,k); } elseif(r! =NULL&&r->num>=t) { c->keys[t-1]=x->keys[i]; if(! c->leaf) { c->children[t]=r->children[0]; } c->num++; x->keys[i]=r->keys[0]; for(j=0;j<=r->num-2;j++) { r->keys[j]=r->keys[j+1]; } if(! r->leaf) { for(j=0;j<=r->num-1;j++) { r->children[j]=r->children[j+1]; } } r->num--; b_tree_delete(c,k); } else { if(l! =NULL) { for(j=2*t-2;j>=t;j--) { c->keys[j]=c->keys[j-t]; } c->keys[t-1]=x->keys[i-1]; for(j=0;j<=t-2;j++) { c->keys[j]=l->keys[j]; } if(! c->leaf) { for(j=2*t-1;j>=t;j--) { c->children[j]=c->children[j-t]; } for(j=0;j<=t-1;j++) { c->children[j]=c->children[j]; } } c->num=2*t-1; for(j=i-1;j<=x->num-2;j++) { x->keys[j]=x->keys[j+1]; x->children[j]=x->children[j+1]; } x->children[x->num-1]=x->children[x->num]; x->num--; b_tree_delete(c,k); } else { c->keys[t-1]=x->keys[i]; for(j=t;j<=2*t-2;j++) { c->keys[j]=r->keys[j-t]; } if(! c->leaf) { for(j=t;j<=2*t-1;j++) { c->children[j]=r->children[j-t]; } } c->num=2*t-1; for(j=i;j<=x->num-2;j++) { x->keys[j]=x->keys[j+1]; x->children[j+1]=x->children[j+2]; } x->children[x->num-1]=x->children[x->num]; b_tree_delete(c,k); } } } else { b_tree_delete(c,k); } } else { return0; } } structnode*b_tree_search(structnode*x,intk) { inti; i=0; while(i<=x->num-1&&k>x->keys[i]) { i++; } if(i<=x->num-1&&k==x->keys[i]) { index=i; returnx; } if(x->leaf)returnNULL; else { returnb_tree_search(x->children[i],k); } } voidb_tree_walk(structnode*x) { inti; if(x->leaf) { for(i=0;i<=x->num-1;i++) printf("%d",x->keys[i]); } else { for(i=0;i<=x->num-1;i++) { b_t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 1130310126 李明远 第五 作业 练习
![提示](https://static.bdocx.com/images/bang_tan.gif)