数据结构作业系统_第九章答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9.26②试将折半查找算法改写成递归算法。
实现下列函数:
int BinSearch(SSTable s, int low, int high, KeyType k);
/* Index the element which key is k */
/* in StaticSearchTable s. */
/* Return 0 if x is not found. */
静态查找表的类型SSTable定义如下:
typedef struct {
KeyType key;
... ... // 其他数据域
} ElemType;
typedef struct {
ElemType *elem;
int length;
} SSTable;
int BinSearch(SSTable s, int low, int high, KeyType k)
/* Index the element which key is k */
/* in StaticSearchTable s. */
/* Return 0 if x is not found. */
{
int mid=(low+high)/2;
if(low>high)return 0;
if(s.elem[mid].key==k)return mid;
else if(s.elem[mid].key>k)return BinSearch(s,low,mid-1,k);
else return BinSearch(s,mid+1,high,k);
}
9.31④试写一个判别给定二叉树是否为二叉排序树
的算法,设此二叉树以二叉链表作存储结构。且树中
结点的关键字均不同。
实现下列函数:
Status IsBSTree(BiTree t);
/* 判别给定二叉树t是否为二叉排序树。*/
/* 若是,则返回TRUE,否则FALSE */
二叉树的类型BiTree定义如下:
typedef struct {
KeyType key;
... ... // 其他数据域
} ElemType;
typedef struct BiTNode {
ElemType data;
BiTNode *lchild,*rchild;
}BiTNode, *BiTree;
Status IsBSTree(BiTree t)
/* 判别给定二叉树t是否为二叉排序树。*/
/* 若是,则返回TRUE,否则FALSE */
{
KeyType k;
if(t==NULL)return TRUE;
k=t->data.key;
if(t->lchild==NULL&&t->rchild==NULL)return TRUE;
if(t->lchild!=NULL&&t->rchild!=NULL)
{
if(k>t->lchild->data.key&&k
if(IsBSTree(t->lchild)&&IsBSTree(t->rchild))
return TRUE;
return FALSE;
}
if(t->lchild!=NULL&&k>t->lchild->data.key)
if(IsBSTree(t->lchild))return TRUE;
if(t->rchild!=NULL&&k
if(IsBSTree(t->rchild))return TRUE;
return FALSE;
}
9.33③编写递归算法,从大到小输出给定二叉排序树
中所有关键字不小于x的数据元素。要求你的算法的时
间复杂度为O(log2n+m),其中n为排序树中所含结点数,m为输出的关键字个数。
实现下列函数:
void OrderOut(BiTree t, KeyType x, void(*visit)(TElemType)); /* Output is to use visit(t->data); */
二叉树的类型BiTree定义如下:
typedef struct {
KeyType key;
... ... // 其他数据域
} ElemType;
typedef struct BiTNode {
ElemType data;
BiTNode *lchild,*rchild;
}BiTNode, *BiTree;
void OrderOut(BiTree t, KeyType x, void(*visit)(TElemType)) /* Output is to use visit(t->data); */
{
if(t==NULL)return;
OrderOut(t->rchild,x,visit);
if(t->data.key>=x)
visit(t->data);
OrderOut(t->lchild,x,visit);
}
9.44④已知某哈希表的装载因子小于1,哈希函数
H(key)为关键字(标识符)的第一个字母在字母表中
的序号,处理冲突的方法为线性探测开放定址法。
试编写一个按第一个字母的顺序输出哈希表中所有
关键字的算法。
实现下列函数:
void PrintKeys(HashTable ht, void(*print)(StrKeyType));
/* 依题意用print输出关键字*/
哈希表的类型HashTable定义如下:
#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1
typedef char StrKeyType[4];
typedef struct {
StrKeyType key;
void *any;
} HElemType;
int hashsize[] = { 7,11,17,23,29,37,47 };
typedef struct {
HElemType elem[MAXLEN];
int count;
int sizeindex;
} HashTable;