算法设计题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<k){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<a) count++;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 pri ntf(“ %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<i≤表长)个结点前。
【答案】int algo1(LNode *ha, LNode *hb,int i){for(p=hb;p->next; p=p->next);for(j=1,q=ha;j<i; j++) q=q->next;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<N;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;p=q;q=s;}return h;}11. 设二叉树T采用二叉链表结构存储,数据元素为字符类型。
设计算法将二叉链表中所有data域为小写字母的结点改为大写字母。
【答案】void algo2(BTNode *bt){if (bt){if(bt->data>=’a’&& bt->data<=’z’)bt->data-=32;algo2(bt->lchild);algo2(bt->rchild);}}12. 假设线性表以带表头结点的循环单链表表示。
试设计一个算法,在线性表的第k个元素前插入新元素y。
假如表长小于k,则插在表尾。
【答案】void Insertlist(LNode *h,int k,ElemType y){q=h; P=h->next; j=1;while( p!=h && j<k){q=p; p=p->next; j++;}s=(LNode *)malloc(sizeof(Lnode));s->data=y;q->next=s;s->next=q;}13. 有一带表头结点的单链表,其结点的元素值以非递减有序排列,编写一个算法在该链表中插入一个元素x,使得插入后的单链表仍有序。
【答案】void algo1 (LNode *H, ElemTp x){s=(LNode *) malloc (sizeof(LNode));s->data=x;q=H; p=H->next;while ( p && p->data<=x ){q=p; p=p->next;}s->next=p; q->next=s;}14. 二叉排序树的类型定义如下: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<a) count++;f34(p->lchild);return count;}15. 有一带表头结点的单链表,其结点的data域的类型为字符型,编写一个算法删除该链表中的数字字符。
【答案】void Del_digit (LNode *h){for(p=h;p->next;){q=p->next;if(q->data>=’0’&& q->data <=’9’){p->next=q->next; free(q); }else p=q;}}16. 利用栈的基本运算,编写一个算法,实现将整数转换成二进制数输出。
【答案】void returnDtoO(int num){initStack(s);while(n){ k=n%2;n=n/2;push(s,k);}while(EmptyStack(s)){ pop(s,k);printf(“%d”,k);}}17. 设二叉树T采用二叉链表结构存储,数据元素为int型,试设计一个算法,若结点左孩子的data域的值大于右孩子的data域的值,则交换其左、右子树。
【答案】void algo2(bitreptr bt){bitreptr x;if (bt){if ((bt->lchild && bt->rchild) && (bt->lchild ->data> bt->rchild->data) ) {x= bt->lchild ;bt->lchild= bt->rchild;bt->rchild=x;}algo2(bt->lchild);algo2(bt->rchild);}}18. 设二叉树T采用二叉链表结构存储,试设计算法求出二叉树的深度。