一、题目要求
本题要求实现一个函数,中序输出运算式中的运算符,并返回运算符的个数
1.函数接口定义:
int Infix_num(BiTree T);
T是表达式二叉树树根指针,函数Infix_num中序输出该表达式中的运算符,格式为一个字符后面跟着一个空格,并返回运算符的个数。
2.裁判测试程序样例:
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
BiTree Create();/* 细节在此不表 */
int Infix_num(BiTree T);
int main()
{
BiTree T = Create();
printf("\n%d",Infix_num(T));
return 0;
}
/* 你的代码将被嵌在这里 */
3.输入样例:
对于图中给出的二叉树,输入数据为扩展的先序序列:
+-A##*F##G##C##
4.输出样例(对于图中给出的树):

- * +
3
二、题目答案
给出代码如下:
int Infix_num(BiTree T)
{
int a,b; //记录T左孩子和右孩子的返回的数据
if(!T) return 0; //T为空,返回0
if(!T->lchild&&!T->rchild) return 0; //左右孩子都没有,既不是双目也不是单目,直接返回0
if(T->lchild||T->rchild) //有孩子(双目或单目)
{
a=Infix_num(T->lchild); //递归调用T的左孩子
printf("%c ",T->data); //中序输出根节点
b=Infix_num(T->rchild); //递归调用T的右孩子
return a+b+1; //将T的做孩子输出的数据与T的右孩子输出的数据相加并加上1
}
}
三、代码解析
所写函数返回类型为int型,返回值为运算符的个数,每一次的返回值应当为该判断节点的运算符个数(0或1)加上该节点后面的运算符个数,据此推断该算法应运用递归来写(注:如果该判断节点运算符个数为0,代表他没有左右孩子,即该节点后面的运算符个数为0,可以直接返回0)。
如果该判断的节点有左右孩子节点,代表他是一个运算符。如果只有左孩子,代表是单目运算符,如果左右孩子都有,代表是双目运算符,无论是双目还是单目,都可以一同进行操作,所以将判断条件改为“T->lchild||T->rchild”。如果满足条件,则需要进行中序输出,所以先递归调用左孩子,再输出根节点数据,最后递归调用右孩子。调用结束后需要进行返回,返回值应该在左右孩子总的运算符个数上加一,为避免重复调用左右孩子,造成答案错误,应提前将左右孩子的返回数据储存在int型变量a,b中,在返回时只需要返回a+b+1,也可以节省运算时间。
如果该判断节点为空或没有左右孩子节点,代表他不是运算符,他后面也没有运算符,所以返回0。
该文描述了一个函数,用于中序遍历运算符二叉树并打印运算符,同时返回运算符的数量。函数通过递归处理二叉树的左子树、根节点和右子树,特别地,当节点无左右孩子时返回0,有孩子时返回1加上左右子树的运算符总数。
752

被折叠的 条评论
为什么被折叠?



