LYU pta 6-22 中序输出运算式中的运算符,并返回运算符的个数

该文描述了一个函数,用于中序遍历运算符二叉树并打印运算符,同时返回运算符的数量。函数通过递归处理二叉树的左子树、根节点和右子树,特别地,当节点无左右孩子时返回0,有孩子时返回1加上左右子树的运算符总数。

一、题目要求

本题要求实现一个函数,中序输出运算式中的运算符,并返回运算符的个数

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值