束whileemptyQr
retur
pr
算法结束r
r
20、给出折半查找的递归算法,并给出算法时间复杂度性分析。r
21、二路插入排序是将待排关键字序列r1
中关键字分二路分别按序插入到辅助向量d1
前半部和后半部(注向量d可视为循环表),其原则为,先将rl赋给d1,再从r2记录开始分二路插入。编写实现二路插入排序算法。r
22、对一般二叉树,仅根据一个先序、中序、后序遍历,不能确定另一个遍历序列。但对于满二叉树,任一结点的左右子树均含有数量相等的结点,根据此性质,可将任一遍历序列转为另一遍历序列(即任一遍历序列均可确定一棵二叉树)。r
voidPreToPostElemTypepreposti
tl1h1l2h2r
将满二叉树的先序序列转为后序序列,l1h1l2h2是序列初始和最后结点的下标。r
ifh1l1r
posth2prel1根结点r
halfh1l12左或右子树的结点数r
PreToPostprepostl11l1halfl2l2half1将左子树先序序列转为后序序列r
PreToPostprepostl1half1h1l2halfh21将右子树先序序列转为后序序列r
PreToPostr
32叶子结点只有在遍历中才能知道,这里使用中序递归遍历。设置前驱结点指针pre,初始为空。第一个叶子结点由指针head指向,遍历到叶子结点时,就将它前驱的rchild指针指向它,最后叶子结点的rchild为空。r
Li
kedListheadpre
ull全局变量r
Li
kedListI
OrderBiTreebtr
中序遍历二叉树bt,将叶子结点从左到右链成一个单链表,表头指针为headr
ifbtI
Orderbtlchild中序遍历左子树r
ifbtlchild
ullbtrchild
ull叶子结点r
ifpre
ullheadbtprebt处理第一个叶子结点r
elseprerchildbtprebt将叶子结点链入链表r
I
Orderbtrchild中序遍历左子树r
prerchild
ull设置链表尾r
r
retur
headI
Orderr
时间复杂度为O
辅助变量使用head和pre栈空间复杂度O
r
r
23、假设K1,…,K
是
个关键词,试解答:r
试用二叉查找树的插入算法建立一棵二叉查找树,即当关键词的插入次序为K1,K2,…,K
时,用算法建立一棵以LLINKRLINK链接表示的二叉查找树。r
r
24、约瑟夫环问题(Josephus问题)是指编号为1、2、…,
的
(
0)个人按顺时针方向围坐成一圈,现从第s个人开始按顺时针方向报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列,…,如此重复直到所有的人全部出列为止。现要求采用循环链表结构设计一个算法,模拟此过程。r
i
cludestdlibhr
typedefi
tdatatyper
typedefstruct
oder
datatypedatar
struct
ode
extr
list
oder
typedeflir