问题 问答题

【说明】 设M叉树采用列表法表示,即每棵子树对应一个列表,列表的结构为:子树根节点的值部分(设为一个字符)和用“()”,括起来的各子树的列表(如有子树的话),各子列表间用“,”分隔。例如下面的三叉树可用列表a(b(c,d),e,f(g,h,i))表示。

本程序输入列表,生成一棵M叉树,并由M叉树输出列表。假定输入无错误。 【函数5-8】 #inelude<stdio.h> #include<stdlib.h> #define M3 typedef struct node{char val;street node *subTree[M]; }NODE; char buf[255], *six = buf; NODE *d = NULL; NODE *makeTree()/*由列表生成M叉树*/ { int k; NODE *s; s= (1) ; s->val=*six++; for(k=0; k<M; k++)s->subTree[k]=NULL; if(*str==’(’){ k=0; do{ six++; s->subTree[k]= (2) ; if(*str==’)’){six++;break; } k=k+1; }while( (3) ); } return s; } void walkTree(NODE *t)/*由M叉数输出列表*/ {int i;if(t !=NULL){ (4) ; if(t->subTree[0]==NULL)return; putchar(’(’); for(i=0;i<M; i++){ (5) ; if(i !=M-1 && t->subTree[i+1]!=NULL)putchar(’,’); } putchax(’)’);} } void main() {prinff("Enter exp:");scanf("%s", str);d = makeTree();walkTree(d);putchaW’,n’); }

答案

参考答案:

解析:(1) (NODE*)malloc(sizeoffNODE))
(2) makeTree()
(3) *str==’,’
(4) putchar(t->val)
(5) walkTree(t->subTree[i])

[分析]:
本题考查M叉树的应用,是一种二叉树的推广,只是将子树的数目由2推广为M,这样子树需要用一个数组来存储,在此为node结构中的subTree字段。
函数makeTree是根据列表生成M叉树。空(1)比较简单,变量s已声明为NODE指针,紧接着有对其的引用s->val,将列表中的第一字符赋值给s中的val字段,而指针在引用前需要指向确定的内存单元,此处应该申请内存空间,故空(1)应填(Node*)malloc(sizeof(NODE))。
接着用for循环将s的子树指针列表初始化为NULL。根据题中说明,列表的结构中子树用括号括起来。因此判断列表中的下一个字符是否为左括号“(”,如果不是,说明没有子树:如果是,则生成子树。通过do-while循环来生成子树列表。根据M叉树的递归性质,可得空 (2)应填makeTree()。
空(3)相对较难,是while循环继续的条件,循环体的功能就是生成一棵子树,循环继续意味着需要生成另一棵子树。根据列表的结构,子树间是用逗号“,”分隔的,因此循环继续的条件就是此时处理的字符是逗号。故空(3)应填*str==’,’。
函数walkTree是由M叉树输出列表。根据列表的结构,先输出根节点的值,然后如果有子树的话用括号将其括起来,子树间用逗号分隔,类似于二叉树的前序遍历。因此易得空(4)应填putchar(t->val),或其他等价形式,总之就是输出变量t->val存储的字符。类似空(2),根据M叉树的递归性质,空(5)应填walkTree(t->subTree[i])。紧接着的if块正是判断是否还有子树,若有就输出逗号。
(1) (NODE*)malloc(sizeoffNODE))
(2) makeTree()
(3) *str==’,’
(4) putchar(t->val)
(5) walkTree(t->subTree[i])

单项选择题
选择题