填空题
下面分别是用类程序设计语言和c++语言描述的算法preorder1(由算法revisel调用)和preorder2(由算法revise2调用),其功能是通过二叉树的先序遍历,将二叉树中数据域值等于c的结点修改为数据域值d,并累加修改的结点个数s。
二叉树结点如图2所示,其中,数据域data为字符型,llink、rlink分别为指向左、右孩子的指针域。
请选择一种算法描述形式,在算法中的空格处填入正确内容并回答问题(①、②任选一题,只能选做一题)。
①类程序设计语言描述形式符号&开头的参数为引用参数(即输入输出参数)。bt指向二叉树结点的数据域用bt^.data表示,指向左、右孩子的指针域分别用bt^.llink、bt^.rlink表示。算法中,"<-"为赋值号,nil为空指针。
algorithm preorder1(bt,c,d,&s)
//bt为指向二叉树根结点的指针//
//c,d为字符型//
//s为整型//
{
if bt<>nil
then{if bt^.data=c
then { 1(13) 2;
s<-s+1;
}
preorderl(bt^.llink,c,d,s);
3(14) 4
}
}
algorithm revisel(bt)
//bt为指向二叉树根结点的指针
//c,d为字符型
//is为整型
{
write('c='); 5(15) 6;
write('d=');readln(d);
7(16) 8;
preorder1(bt,c,d,s);
writeln('s=',s)
}
回答以下问题:
(17)preorder1算法中,语句s<-s+1的作用是 9(17) 10 。
(18)设先序遍历bt所指向二叉树的结点序列为:ABDFECH;中序遍历bt所指向二叉树的结点序列为:DBFEACH;若c='D'、d='G',则执行上述算法程序后,后序遍历bt所指向二叉树的结点序列的第一个结点是 11(18) 12 。
(19)上述算法中,先序遍历过程preorder1是否可以改为后序遍历过程 13(19) 14(是或否)。
②c++语言描述形式符号&开头的参数为引用参数。bt指向二叉树结点的数据域用bt->data表示,指向左、右孩子的指针域分别用bt->llink、bt->rlink表示。
algorithm preorder2(bt,c,d,&s)
//bt为指向二叉树根结点的指针
//c,d为字符型
//s为整型
{
if(bt){
if(bt->data==c){
15(20) 16;
++s;
}
preorder2(bt->llink,c,d,s);
17(21) 18;
}
}
algorithm revise2(bt)
//bt为指向二叉树根结点的指针
//c,d为字符型
//s为整型
{
cout<<"c="; 19(22) 20;
cout<<"d=";cin>>d;
21(23) 22;
preorder2(bt,c,d,s);
cout<<"s="<23(24) 24 。
(25)设先序遍历bt所指向二叉树的结点序列为:ABDFECH;中序遍历bt所指向二叉树的结点序列为:DBFEACH;若c='D'、d='G',则执行上述算法程序后,后序遍历bt所指向二叉树的结点序列的第一个结点是 25(25) 26 。
(26)上述算法中,先序遍历过程preorder2是否可以改为后序遍历过程 27(26) 28(是或否)。
【正确答案】
1、①(13)bt^.data=d
(14)preorder1(bt^.rlink,c,d,s)
(15)read(c)
(16)s<-0
(17)累加修改的结点个数
(18)G
(19)是
②(20)bt->data=d。
(21)preorder2(bt->rlink,c,d,s)
(22)cin>>C
(23)s=0
(24)累加修改的结点个数
(25)G
(26)是
【答案解析】