猴子选王问题和二叉树求解论文Word格式.docx
《猴子选王问题和二叉树求解论文Word格式.docx》由会员分享,可在线阅读,更多相关《猴子选王问题和二叉树求解论文Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
五、详细程序清单12
5.1猴子选王问题12
5.1.1单循环链表解决猴子选王问题12
5.1.2顺序结构(数组)解决解决猴子选王问题15
5.2二叉树问题的求解18
六、程序运行结果20
6.1猴子选王问题20
6.1.1单循环链表解决猴子选王问题20
6.1.2顺序结构(数组)解决解决猴子选王问题21
6.2二叉树问题的求解22
七、分析与体会23
一、问题描述
1.1问题描述
1.1.1猴子选王问题
一堆猴子都有编号,编号是1,2,3...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
1.1.2二叉树问题
已知二叉树T中结点的中序和后序遍历序列,编写算法实现构造满足上述条件的二叉树。
1.2基本要求
1.2.1猴子选王问题
(1)利用单循环链表作为存储结构模拟此过程;
(2)输入数据:
输入m,n,m,n为整数,n<
m;
(3)输出形式:
中文提示按照m个猴子,数n个数的方法,输出为大王的猴子是几号,建立一个函数来实现此功能。
【选做内容】
(1)添加在顺序结构上实现的部分;
(2)界面设计的优化。
1.2.2二叉树问题
(1)假设二叉树T的结点值是字符。
(2)建立的二叉树以二叉链表的存储结构进行存储
(3)输出二叉树的先序遍历序列。
二、问题分析
2.1猴子选王问题的分析
2.1.1需求分析
要求:
输入数据:
输入整数m、n,m>
n
输出形式:
提示输入m只猴子,数到的数为n,输出为大王的猴子为几号,建立一个函数来实现此功能.
步骤:
输入m、n后,进行1—n的报数,每数到n,则删除该猴子,直至只剩一只猴子,输出它的编号为猴子王。
2.1.2过程分析
假设m=5,n=3
则过程为:
第一轮:
1->
2->
3淘汰3
第二轮:
4->
5->
1淘汰1
第三轮:
5淘汰5
第四轮:
2淘汰2
由此得出:
4为猴子王!
!
2.2二叉树求解问题
2.2.1需求分析
输入:
某二叉树的中序和后序序列。
输出:
求出其先序序列。
步骤:
输入后序和中序序列后,判断是否存在树,存在则输出它的先序序列。
2.2.2过程分析
假设:
中序为:
DBEAFCG
后序为:
DEBFGCA
则求出该树:
则它的先序为:
ABDECFG
3、数据结构描述
3.1猴子选王问题
typedefstructLnode{
intdata;
structLnode*next;
}linklist;
//单循环链表解决猴子选王问题
3.2二叉树求解问题
structTreeNode
{
structTreeNode*left;
structTreeNode*right;
charelem;
};
//树的二叉链表存储表示
4、算法设计
4.1猴子选王问题
4.1.1单循环链表解决猴子选王问题
算法:
intmonkeyking(intm,intn){
inti,total;
linklist*head,*p,*s,*q;
head=(linklist*)malloc(sizeof(linklist));
p=head;
p->
data=1;
next=p;
for(i=2;
i<
=m;
i++){
s=(linklist*)malloc(sizeof(linklist));
s->
data=i;
s->
next=p->
next;
p->
next=s;
p=p->
}//初始化链表
total=m;
//保存总节点数
q=head;
while(total!
=1){
for(i=1;
i<
n;
p=p->
//报数过程,p指向要删除的节点
}
while(q->
next!
=p){
q=q->
//q指向p的节点的前驱
q->
next;
//删除p节点
s=p;
free(s);
total--;
}
printf("
themonkeykingis:
%d\n"
p->
data);
free(p);
return0;
}
4.1.2顺序结构(数组)解决解决猴子选王问题
intfindMonkeyKing(intm,intn){
inta[100];
inti=1;
intcount=1;
//记录报数的次数
inttotal=m;
for(;
i++){//将猴子按从1到m编号
a[i-1]=i;
}
while(m!
if(count<
n){
if(a[i]!
=0){
count++;
i++;
i=i%total;
}
else
if(count=n){
a[i]=0;
m--;
i++;
i=i%total;
count=1;
returni;
4.2二叉树问题的求解
TreeNode*BinaryTree(char*inorder,char*aftorder,intlength)
if(length==0)
{
returnNULL;
TreeNode*node=newTreeNode;
node->
elem=*(aftorder+length-1);
%c"
node->
elem);
introotIndex=0;
for(;
rootIndex<
length;
rootIndex++)
if(inorder[rootIndex]==*(aftorder+length-1))
break;
left=BinaryTree(inorder,aftorder,rootIndex);
right=BinaryTree(inorder+rootIndex+1,aftorder+rootIndex,length-(rootIndex+1));
returnnode;
5、详细程序清单
5.1猴子选王问题
5.1.1单循环链表解决猴子选王问题
#include<
stdio.h>
malloc.h>
typedefstructLnode{
intmonkeyking(intm,intn){
//printf(“【%d】”,p->
while(q->
voidmain(){
intm,n;
********WELCOMETOOURDESIGN********\n"
);
*************MONKEY*************\n"
-------\n"
/^^\\\n"
C|@@|D\n"
\\--/\n"
\\_____/\n"
**************************************\n"
IKING\n"
WANTTHE\n"
TOBE\n"
pleaseinputthenumberofmandn(m>
n):
"
scanf_s("
%d%d"
&
m,&
n);
monkeyking(m,n);
system("
pause"
5.1.2顺序结构(数组)解决解决猴子选王问题
intfindMonkeyKing(intm,intn){
voidmain()
{
themonkeykingis:
findMonkeyKing(m,n));
}
5.2二叉树问题的求解
#include<
string>
typedefstructTreeNode
}TreeNode;
TreeNode*node;
node=(TreeNode*)malloc(sizeof(TreeNode));
node->
intmain(intargc,char**argv)
char*post="
DEBFGCA"
;
char*mid="
DBEAFCG"
intlength=strlen(mid);
*************BITREE*************\n"
A\n"
/\\\n"
BC\n"
/\\/\\\n"
DEFG\n"
中序序列为:
%s\n"
mid);
后序序列为:
post);
先序序列为:
BinaryTree(mid,post,length);
\n"
}程序运行结果
六、程序运行结果
6.1猴子选王问题
6.1.1单循环链表解决猴子选王问题
6.1.2顺序结构(数组)解决解决猴子选王问题
6.2二叉树问题的求解
七、分析与体会
短短一周的时间过去了,而我们的课程设计也接近尾声。
这期间,有对自己学过的知识的一个回顾,也有新的知识的补充。
当有自己不懂时就翻阅资料,寻求解答;
当有疑问的时候,有成员之间的讨论,老师的指导。
初拿到该题目时,我们小组感觉无从下手,
不知道该用什么样的数据类型,用什么样的储存结构,怎么实现题目中要求的功能。
后来,通过从图书馆借的参考书和网上查到的资料,再经过小组成员的分析,思绪渐渐明朗起来,猴子选王问题我们采用单循环链表还有数组方法来实现;
二叉树选择二叉树链表来实现。
就根据这样的思路编程,我们初步将程序编译调试,过程中有很多问题但是我们组员在不对的调试中,发现问题,解决问题,终于把整个问题都解决了,把整个程序都编出来了。
虽然,我们的课程设计已经完成,但是,对数据结构的学习似乎才是开始,以后要学习的还很多很多,前面要走的路还很远很远。
而我们也要整装待发,在摸索中前进,在前进中不断摸索,让自己的路走得更远更长!
八、参考资料
[1]朱蓉,数据结构实验指导书
[2]严蔚敏,吴伟民,数据结构(C语言版).北京:
清华大学出版社,1997
[3]严蔚敏,吴伟民,数据结构题集(C语言版).北京: