二叉排序树的应用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
break;
}
else
{
b = b->right;
}
}
}
return;
}
3.2.3前序遍历模块
void preorder(btree *b)
{
btree *stack[100];
btree *p = NULL;
int top = 0;
p = b;
if(b != NULL)
{
top = 1;
stack[top] = p;
2概要设计
2.1所需模块
根据程序功能,确定所需模块如下:
(1)主函数菜单模块
(2)插入模块
(3)前序遍历模块
(4)中序遍历模块
(5)后序遍历模块
(6)删除模块
2.2功能模块关系图
3算法描述
3.1模块流程图
3.2各模块代码
3.2.1主函数菜单模块
该模块功能主要是给用户提供清晰的可操作界面,易于人机操作。并能很好的调用其他各模块,使程序更加优化,思路更加清晰,结构更加明了,提高了程序的实用性。其算法如下:
{
btree *stack[100];
btree *p = NULL;
btree *q = NULL;
int sign = 0;
int top = -1;
p = b;
exit(1);
}
printf("请输入根结点:\n");
scanf("%d",&a);
head->data = a;
head->left = NULL;
head->right = NULL;
printf("请输入叶子结点,以-1为终止符:\n");
while(1)
{
scanf("%d",&x);
if(x == -1)
《数据结构》
课程设计报告书
题目:二叉排序树的实现
系别:计算机科学与应用
1设计要求
(1)用顺序和二叉链表作存储结构
(2)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T;
(3)对二叉排序树T作中序遍历,输出;
(4)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”;
while(top > 0)
{
p = stack[top];
top--;
printf("%d",p->data);
if(p->right != NULL)
{
top++;
stack[top] = p->right;
}wenku.baidu.com
if(p->left != NULL)
{
top++;
stack[top] = p->left;
void insert(btree *b,btree *s)
{
while(1)
{
if(b->data >= s->data)
{
if(b->left == NULL)
{
b->left = s;
break;
}
else
{
b = b->left;
}
}
else
{
if(b->right ==NULL)
{
b->right = s;
int main(void)
{
int a = 0;
int x = 0;
int b = 0;
btree *head = NULL;
btree *s = NULL;
head = (btree *)malloc(sizeof(btree));
if(head == NULL)
{
printf("head malloc error in main!\n");
preorder(head);
printf("\n");
printf("删除元素后中序遍历为:\n");
inorder(head);
printf("\n");
printf("删除元素后后序遍历为:\n");
poetorder(head);
printf("\n");
frenode(head);
return 0;
A)以中序遍历方式遍历左子树;
B)访问根结点;
C)以中序遍历方式遍历右子树。其算法如下:
void inorder(btree *b)
{
btree *stack[100];
btree *p = NULL;
int top = 0;
p = b;
do
{
while(p != NULL)
{
top++;
stack[top] = p;
break;
s = (btree *)malloc(sizeof(btree));
s->data = x;
s->left = NULL;
s->right = NULL;
insert(head,s);
}
printf("前序遍历为:\n");
preorder(head);
printf("\n");
printf("中序遍历为:\n");
}
3.2.2插入模块
在二叉排序树中插入新结点,要保证插入后的二叉树仍符合二叉排序树的定义。插入过程:若二叉排序树为空,则待插入结点*p作为根结点插入到空树中;当非空时,将待插结点关键字p->item和树根关键字t->item进行比较,若p->item=t->item,则无需插入,若p->item<t->item则插入到根的左子树中,若p->item>t->item,则插入到根的右子树中。而子树中的插入过程和在树中的插入过程相同,如此进行下去,直到把结点*P作为一个新的树叶插入到二叉排序树中,或者直到发现树已有相同关键字的结点为止。其算法如下:
inorder(head);
printf("\n");
printf("后序遍历为:\n");
poetorder(head);
printf("\n");
printf("请输入你需要删除的元素,不要犯错误!\n");
scanf("%d",&b);
delnode(head,b);
printf("删除元素后前序遍历为:\n");
}
}
}
return;
}
3.2.4中序遍历模块
遍历是指沿着某条搜索路线,依次对树中每个结点均做一次且仅作一次访问。访问结点所做的操作依赖于具体的应用问题。二叉树共有三个部分组成,即根结点,根结点的左子树,根结点的右子树。限定以从左至右方式共有三种遍历即前序遍历,中序遍历,后序遍历。中序遍历的原则:若被遍历的二叉树为非空,则依次执行如下操作:
p = p->left;
}
if(top > 0)
{
p = stack[top];
top--;
printf("%d",p->data);
p = p->right;
}
}while(p != NULL || top != 0);
return;
}
3.2.5后序遍历模块
void poetorder(btree *b)
相关文档
最新文档