PAT 1130 Infix Expression

这题根据中缀表达式的二叉树,输出中缀表达式。
这一题没写出来,只得了17分。以为写个中序遍历能很快出来的,被括号给难住了。
开始是以子节点为中心,即到了这个节点才判断是否加括号,后来发现左右节点加的括号不一样,要传入是否左右节点的判断,修改后还是有问题。就改成以父节点为中心,即在父节点就进行判断是否加括号,想得太复杂,分了好几种情况,后面改来改去还是有问题。最后,只能看一下别人是怎么写的。
根据思路,除根节点外,所有节点若有子节点,则加括号。
在写这题时,发现了一个问题:用scanf("%s",str[0].c_str());对string类型的数组进行输入时,str[0].size()会为0(可以使用sizeof(str[0])/sizeof(string)来解决),而且在使用printf("%s",str[0].c_str())输出时可能会出错。后改用getline输入(getline输入时要排除' '空格)和cout输出
这一题也算有所收获,毕竟二叉树原来使用的不多,做个记录。

#include <bits/stdc++.h>
using namespace std;

void  inorderTraversal(string tree[],int left[],int right[],int index,int isLeftTree){
    bool flag = false;
    if(index ==-1)
        return;
      if(left[index]!=-1){
            if(isLeftTree!=-1){
                printf("(");
                flag = true;
            }
        inorderTraversal(tree,left,right,left[index],1);
      }
      else{
        if(right[index]!=-1&& isLeftTree!=-1){
            printf("(");
            flag = true;
        }
      }

      cout<<tree[index];
      if(right[index]!=-1){
        inorderTraversal(tree,left,right,right[index],0);
      }
     if(flag){
        printf(")");
     }
}
int main()
{
    string treeValue[21];
    int treeLeft[21];
    int treeRight[21];
    int isRoot[21]={0};
    int n;
    scanf("%d",&n);
    getchar();
    for(int i=1;i<=n;i++){
    getline(cin,treeValue[i],' ');
    scanf("%d%d",&treeLeft[i],&treeRight[i]);
    getchar();
        if(treeLeft[i]!=-1){
            isRoot[treeLeft[i]] = 1;
        }
        if(treeRight[i]!=-1){
             isRoot[treeRight[i]] = 1;
        }
    }
    int rootIndex=1;
    for(int i=1;i<=n;i++){
        if(isRoot[i]==0){
            rootIndex =i;
            break;
        }
    }
 inorderTraversal(treeValue,treeLeft,treeRight,rootIndex,-1);
 printf("\n");
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值