二叉平衡排序树设计报告文档格式.docx
- 文档编号:20067519
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:20
- 大小:65.29KB
二叉平衡排序树设计报告文档格式.docx
《二叉平衡排序树设计报告文档格式.docx》由会员分享,可在线阅读,更多相关《二叉平衡排序树设计报告文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
2.本设计所采用的数据结构
输入功能:
可以输入结点
输出功能:
可以输出结点
插入功能:
可以插入结点
删除功能:
可以删除结点
查找功能:
可以查找结点
结束功能:
可以终止输入
3.功能模块详细设计
3.1详细设计思想:
从一颗空树开始创建,在创建过程中,保证树的有序性,同时还要针对树的平衡性做些调整。
最终要把创建好的二叉排序树转换为二叉平衡排序树。
基本要求:
(1)创建(插入、调整、改组);
(2)输出。
3.2核心代码:
#include<
stdio.h>
#include<
string.h>
stdlib.h>
errno.h>
assert.h>
typedefstructnodenode;
structnode
{
node*parent;
node*left;
node*right;
intbalance;
intkey;
};
externvoidinterordertraverse(node*root);
externvoidpreordertraverse(node*root);
externvoidpostordertraverse(node*root);
intsearchNode(intkey,node*root,node**parent)
node*temp;
assert(root!
=NULL);
temp=root;
*parent=root->
parent;
while(temp!
=NULL)
{
if(temp->
key==key)return1;
else
*parent=temp;
key>
key)
temp=temp->
left;
else
right;
}
return0;
}
node*minNode(node*root)
if(root==NULL)
returnNULL;
while(root->
left!
=NULL)
root=root->
returnroot;
node*maxNode(node*root)
right!
node*preNode(node*target)
if(target==NULL)
if(target->
returnmaxNode(target->
left);
while((target->
parent!
=NULL)&
&
(target!
=target->
parent->
right))
target=target->
returntarget->
node*nextNode(node*target)
returnminNode(target->
right);
left))
node*adjustAVL(node*root,node*parent,node*child)
node*cur;
assert((parent!
=NULL)&
(child!
=NULL));
switch(parent->
balance)
case2:
if(child->
balance==-1)
cur=child->
cur->
parent=parent->
child->
right=cur->
if(cur->
left->
parent=child;
parent->
left=cur->
right->
parent=parent;
left=child;
parent=cur;
right=parent;
if(parent->
parent!
left==parent)
left=cur;
elseparent->
right=cur;
root=cur;
balance==0)
balance=0;
elseif(cur->
{
balance=1;
}
balance=-1;
left=child->
right=child;
root=child;
balance==1)
break;
case-2:
left=parent;
else\
right=child->
node*insertNode(intkey,node*root)
node*parent,*cur,*child;
assert(root!
if(searchNode(key,root,&
parent))
cur=(node*)malloc(sizeof(node));
key=key;
left=NULL;
right=NULL;
if(key<
key)
child=parent->
while((parent!
=NULL))
if(child==parent->
left)
elseif(parent->
balance=2;
child=parent;
parent=parent->
balance=-2;
if(parent==NULL)
returnadjustAVL(root,parent,child);
node*deleteNode(intkey,node*root)
node*dNode,*parent,*child,*tp;
inttemp,tc;
assert(root!
=NULL);
if(!
searchNode(key,root,&
dNode=root;
elseif((parent->
left!
=NULL)&
(parent->
key==key))
dNode=parent->
elsedNode=parent->
child=dNode;
while((child->
=NULL)||(child->
right!
=NULL))
child=preNode(dNode);
elsechild=nextNode(dNode);
temp=child->
key;
key=dNode->
dNode->
key=temp;
dNode=child;
parent=dNode->
temp=parent->
balance;
tp=parent->
if(tp!
if(parent==tp->
tc=1;
elsetc=-1;
elsetc=0;
root=adjustAVL(root,parent,child);
if(temp==0)
if(tc==1)
child=tp->
elseif(tc==-1)
parent=tp;
if(dNode->
if(dNode==dNode->
elsedNode->
free(dNode);
if(root==dNode)
root=NULL;
dNode=NULL;
node*createAVL(int*data,intsize)
inti;
node*root;
if(size<
1)
root=(node*)malloc(sizeof(node));
root->
parent=NULL;
key=data[0];
for(i=1;
i<
size;
i++)
root=insertNode(data[i],root);
voiddestroyAVL(node*root)
if(root!
destroyAVL(root->
free(root);
root=NULL;
voidinterordertraverse(node*root)
interordertraverse(root->
printf("
%d,%d\n"
root->
key,root->
balance);
}
voidpreordertraverse(node*root)
preordertraverse(root->
voidpostordertraverse(node*root)
if(root!
postordertraverse(root->
%d,%d\n"
root->
key,root->
voidmain()
intdata[]={1,13,7,4},flag=1,n=0;
node*root;
root=createAVL(data,sizeof(data)/sizeof(data[0]));
++++++++++++++++++++++++++++\n"
);
interordertraverse(root);
\n"
preordertraverse(root);
postordertraverse(root);
while(flag)
inta;
pleasechoose:
\n\t1:
insert\n\t2:
delete\n\t3:
search\n\t4:
exit\n"
scanf("
%d"
&
n);
switch(n)
case1:
thedadayouwillinsert:
"
a);
insertNode(a,root);
thedatayouwilldelete:
deleteNode(a,root);
case3:
thedatayouwillsearch:
if(searchNode(a,roo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 平衡 排序 设计 报告