13994数据结构习题及参考答案 - new 下载本文

int R[n]; { int root;

SqStack *s; //s为一个指针栈,类型为seqstack,其中包含top域和数组data s->top= -1; //s栈置空 root=1;

while ((root<=n) && (s->top>-1)) { while (root<=n) { printf(R[root]); s->top++; s->data[s->top]=root; root=2*root;

} if (s->top>-1) //栈非空访问,遍历右子树 { root=s->data[s->top]*2+1; s->top--;

} } }

2. 解答:考虑用一个顺序队que来保存遍历过程中的各个结点,由于二叉树以二叉链表存储,所以可设que为一个指向数据类型为bitree的指针数组,最大容量为maxnum,下标从1开始,同层结点从左到右存放。算法中的front为队头指针,rear为队尾指针。

levelorder (BiTree *t) //按层次遍历二叉树t

{ BiTree *que[maxnum]; int rear,front; if (t!=NULL)

{ front=0; //置空队列 rear=1; que[1]=t; do { front=front%maxsize+1; //出队 t=que[front]; printf(t->data); if (t->lchild!=NULL) //左子树的根结点入队 { rear=rear%maxsize+1; que[rear]=t->lchild;

}

if (t->rchild!=NULL) //右子树的根结点入队

{ rear=rear%maxsize+1; que[rear]=t->rchild;

}

}while (rear= =front); //队列为空时结束 } }

3. 解答:设该线索二叉树类型为bithptr,包含5个域:lchild,ltag,data,rchild,rtag。

insert(p, s) //将s结点作为p的右子树插入 BiThrNode *p,*s; { BiThrNode *q;

if (p->rtag= =1) //无右子树,则有右线索 { s->rchild=p->rchild;

s->rtag=1; p->rchild=s; p->rtag=0;

} else

{ q=p->rchild;

while(q->ltag= =0) //查找p所指结点中序后继,即为其右子树中最左下的结点 q=q->lchild; q->lchild=p->rchild; s->rtag=0; p->rchild=s; }

s->lchild=p; //将s结点的左线索指向p结点 s->ltag=1;

}

4. 解答:利用一个队列来完成,设该队列类型为指针类型,最大容量为maxnum。算法中的front为队头指针,rear为队尾指针,若当前队头结点的左、右子树的根结点不是所求结点,则将两子树的根结点入队,否则,队头指针所指结点即为结点的双亲。

parentjudge(t,n) BiTree *t; int n;

{ BiTree *que[maxnum]; int front,rear; BiTree *parent; parent=NULL; if (t)

if (t->data= =n)

printf(“no parent!”); //n是根结点,无双亲

else

{ front=0; //初始化队列

rear=1;

que[1]=t; //根结点进队 do

{ front=front%maxsize+1; t=que[front];

if((t->lchild->data= =n)|| (t->rchild->data= =n)) //结点n有双亲 { parent=t; front=rear;

printf(“parent”,t->data); } else

{ if (t->lchild!=NULL) //左子树的根结点入队 { rear=rear%maxsize+1; que[rear]=t->lchild;

} if (t->rchild!=NULL) //右子树的根结点入队

{ rear=rear%maxsize+1; que[rear]=t->rchild; }

}

}while(rear= =front); //队空时结束

} }

if (parent = =NULL)

printf(“结点不存在”);

习题8

一、单项选择题

1. 若对n个元素进行直接插入排序,在进行第i趟排序时,假定元素r[i+1]的插入位置为r[j],则需要移动元素的次数为( )。

A. j-i B. i-j-1 C. i-j D. i-j+1

2. 若对n个元素进行直接插入排序,则进行任一趟排序的过程中,为寻找插入位置而需要的时间复杂度为( )。

2

A. O(1) B. O(n) C. O(n) D. O(log2n)

3. 在对n个元素进行直接插入排序的过程中,共需要进行( )趟。

A. n B. n+1 C. n-1 D. 2n

4. 对n个元素进行直接插入排序时间复杂度为( )。

2

A. O(1) B. O(n) C. O(n) D. O(log2n)

5. 在对n个元素进行冒泡排序的过程中,第一趟排序至多需要进行( )对相邻元素之间的交换。

A. n B. n-1 C. n+1 D. n/2

6. 在对n个元素进行冒泡排序的过程中,最好情况下的时间复杂度为( )。

2

A. O(1) B. O(log2n) C. O(n) D. O(n) 7. 在对n个元素进行冒泡排序的过程中,至少需要( )趟完成。 A. 1 B. n C. n-1 D. n/2

8. 在对n个元素进行快速排序的过程中,若每次划分得到的左、右两个子区间中元素的个数相等或只差一个,则整个排序过程得到的含两个或两个元素的区间个数大致为( )。 A. n B. n/2 C. log2n D. 2n

9. 在对n个元素进行快速排序的过程中,第一次划分最多需要移动( )次元素,包括开始把支点元素移动到临时变量的一次在内。

A. n/2 B. n-1 C. n D. n+1

10. 在对n个元素进行快速排序的过程中,最好情况下需要进行( )躺。 A. n B. n/2 C. log2n D. 2n

11. 在对n个元素进行快速排序的过程中,最坏情况下需要进行( )躺。 A. n B. n-1 C. n/2 D. log2n

12. 在对n个元素进行快速排序的过程中,平均情况下的时间复杂度为( )。

2

A. O(1) B. O(log2n) C. O(n) D. O(nlog2n) 13. 在对n个元素进行快速排序的过程中,最坏情况下的时间复杂度为( )。

2

A. O(1) B. O(log2n) C. O(n) D. O(nlog2n) 14. 在对n个元素进行快速排序的过程中,平均情况下的空间复杂度为( )。

2

A. O(1) B. O(log2n) C. O(n) D. O(nlog2n) 15. 在对n个元素进行直接插入排序的过程中,算法的空间复杂度为( )。

2

A. O(1) B. O(log2n) C. O(n) D. O(nlog2n)

16. 对下列四个序列进行快速排序,各以第一个元素为基准进行第一次划分,则在该次划分过程中需要移动元素次数最多的序列为( )。

A. 1, 3, 5, 7, 9 B. 9, 7, 5, 3, 1 C. 5, 3, 1, 7, 9 D. 5, 7, 9, 1, 3

17. 假定对元素序列(7, 3, 5, 9, 1, 12, 8, 15)进行快速排序,则进行第一次划分后,得到的