下面分别是用类程序设计语言和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 { ();
s<-s+1;
}
preorderl(bt^.llink,c,d,s);
()
}
}
algorithm revisel(bt)
//bt为指向二叉树根结点的指针
//c,d为字符型
//is为整型
{
write(’c=’);();
write(’d=’);readln(d);
();
preorder1(bt,c,d,s);
writeln(’s=’,s)
}
回答以下问题:
(17)preorder1算法中,语句s<-s+1的作用是()。
(18)设先序遍历bt所指向二叉树的结点序列为:ABDFECH;中序遍历bt所指向二叉树的结点序列为:DBFEACH;若c=’D’、d=’G’,则执行上述算法程序后,后序遍历bt所指向二叉树的结点序列的第一个结点是()。
(19)上述算法中,先序遍历过程preorder1是否可以改为后序遍历过程 ()(是或否)。
②c++语言描述形式符号&开头的参数为引用参数。bt指向二叉树结点的数据域用bt->data表示,指向左、右孩子的指针域分别用bt->llink、bt->rlink表示。
algorithm preorder2(bt,c,d,&s)
//bt为指向二叉树根结点的指针
//c,d为字符型
//s为整型
{
if(bt){
if(bt->data==c){
();
++s;
}
preorder2(bt->llink,c,d,s);
();
}
}
algorithm revise2(bt)
//bt为指向二叉树根结点的指针
//c,d为字符型
//s为整型
{
cout<<"c=";();
cout<<"d=";cin>>d;
();
preorder2(bt,c,d,s);
cout<<"s="<
}
回答以下问题:
(24)preorder2算法中,语句++s的作用是() 。
(25)设先序遍历bt所指向二叉树的结点序列为:ABDFECH;中序遍历bt所指向二叉树的结点序列为:DBFEACH;若c=’D’、d=’G’,则执行上述算法程序后,后序遍历bt所指向二叉树的结点序列的第一个结点是()。
(26)上述算法中,先序遍历过程preorder2是否可以改为后序遍历过程 ()(是或否)。
参考答案:
①bt^.data=d;preorderA(bt^.rlink,c,d,s);read(c);s<-0;累加修改的结点个数;G;是
②bt->data=d;preorderB(bt->rlink,c,d,s);cin>>C;s=0;累加修改的结点个数;G;是