数据结构算法设计题复习题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法设计题

1. 设二叉树bt采用二叉链表结构存储。试设计一个算法输出二叉树中所有非叶子结点,并求出非叶子结点的个数。

【答案】

int count=0;

void algo2(BTNode *bt){

if (bt){

if(bt->lchild || bt->rchild){

printf(bt->data);

count++;

}

algo2(bt->lchild);

algo2(bt->rchild);

}

}

2. 阅读下列函数arrange()

int arrange(int a[],int 1,int h,int x)

{i]上,使所有≥x的元素均落在a[i+1..h]上。

(2)int f(int b[],int n) 或int f(int b[],int n)

{ {

int p,q;int p,q;

p=arrange(b,0,n-1,0);p=arrange(b,0,n-1,1);

q= arrange(b,p+1,n-1,1);q= arrange(b,0,p,0);

return q-p;return p-q;

} }

3. 假设线性表以带表头结点的循环单链表表示。试设计一个算法,在线性表的第k个元素前插入新元素y。假如表长小于k,则插在表尾。

【答案】

void algo1(LNode *h,int k,ElemType y){

q=h; P=h->next; j=1;

while( p!=h && j

q=p; p=p->next; j++;

}

s=(LNode *)malloc(sizeof(Lnode));

s->data=y;

q->next=s;

s->next=q;

}

4. 二叉排序树的类型定义如下:

typedef struct BSTNode {∥二叉排序树的结点结构

int data; ∥数据域

struct BSTNode *lchild, *rchild; ∥左、右孩子指针

}BSTNode,*BSTree;

设计递归算法,统计一棵二叉排序树T中值小于a的结点个数。

【答案】

int f34(BSTree root)

{

int count;

BSTNode *p;

p=root;

if ( p && p->data

f34(p->lchild);

return count;

}

5. 设二叉树T采用二叉链表结构存储,试设计算法求出二叉树中离根最近的第一个叶子结点。(注:结点按从上往下,自左

至右次序编号)

【答案】

BTNode * Firstleaf(BTNode *bt)

{ InitQueue(Q); 已知一棵具有n个结点的完全二叉树被顺序存储在一维数组中,结点为字符类型,编写算法打印出编号为k的结点的双亲和孩子结点。

【答案】

int algo2(char bt[],int n,int k){

if (k<1||k>n) return 0;

if( k==1) printf(“ %c is a root\n”, bt[1]);

else printf(“ %c’s parent is %c\n”, bt[k], bt[k/2]);

if(2*k<=n) printf(“ %c’s lchild is %c\n”, bt[k], bt[2*k]);

else prin tf(“ %c is not lchild\n”, bt[k]));

if(2*k+1<=n) printf(“ %c’s rchild is %c\n”, bt[k], bt[2*k+1]);

else printf(“ %c is not rchild\n”, bt[k]));

return 1;

}

7. 编写算法,将非空单链表hb插入到单链表ha的第i(0

【答案】

int algo1(LNode *ha, LNode *hb,int i){

for(p=hb;p->next; p=p->next);

for(j=1,q=ha;jnext;

p->next=q->next;

q->next=hb->next ;

free(hb);

}

8. 设二叉树T已按完全二叉树的形式存储在顺序表T中,试设计算法根据顺序表T建立该二叉树的二叉链表结构。顺序表T定义如下:

struct tree{

int no; /* 结点按完全二叉树的编号*/

ElEMTP data; /* 数据域 */

}T[N]; /* N为二叉树T的结点数*/

【答案】

BTNode *creat_tree(struct tree T[N])

{ BTNode *p[MAX];

t=NULL;

for(i=0;i

s=(BTNode *)malloc(sizeof(BTNode));

s->data=T[i].data;

s->lchild=s->rchild=NULL;

m=T[i].no; p[m]=s;

if(m==1) t=s;

else { j=m/2;

if(m%2==0) p[j]->lchild=s;

else p[j]->rchild=s;

}编写算法判断带表头结点的单链表L是否是递增的。若递增返回1,否则返回0。

【答案】

int algo1 (LNode *L)

{

if(!L->next) return 1;

p=L->next;

while(p->next){

if(p->data < p->next->data) p=p->next;

else return 0;

}

return 1;

}

10. 假设一线性表由Fibonacci数列的前n(n≥3)项构成,试以带表头结点的单链表作该线性表的存储结构,设计算法建立该单链表,且将项数n存储在表头结点中。Fibonacci数列根据下式求得:

1 (n=1)

f(n)= 1 (n=2)

f(n-2)+f(n-1) (n≥3)

【答案】

LNode * Creatlist(LNode *h,int n){

h=(LNode *)malloc(sizeof(Lnode));

h->data=n;

h->next=p=(LNode *)malloc(sizeof(Lnode));

p->next=q=(LNode *)malloc(sizeof(Lnode));

p->data= q->data=1;

for(i=3;i<=n;i++){

q->next=s=(LNode *)malloc(sizeof(Lnode));

s->data=p->data+q->data; s->next=NULL;

相关文档
最新文档