1130 Infix Expression (25 分)

给一个二叉树,输出中缀表达式,且加上括号表示运算的优先级~~。
参考柳神的做法
柳婼代码链接
坑点如下
1,给二叉树各节点赋值高度的方法
2,中缀表达式递归的写法
如果当前为叶子结点,直接返回自己的字符串,如果为非叶子结点(右子树不为空),那么返回递归左+当前字符串+递归右结点,并加上括号。如果左右结点有空的,返回字符串""

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
struct Node{
    string data;
    int lchild;
    int rchild;
    int height;
}node[25];
bool isroot[25];
int n;
int root=-1;
string DFS(int index){
    if(index==-1)return "";
    if(node[index].rchild!=-1){
      node[index].data=DFS(node[index].lchild)+node[index].data+DFS(node[index].rchild);
      if(index!=root)node[index].data='('+node[index].data+')';
    }
    return node[index].data;
}
int main(){
  scanf("%d",&n);
  string temp;
  memset(isroot,true,sizeof(isroot));
  int l,r;
  for(int i=1;i<=n;i++){
      cin>>node[i].data;
      scanf("%d%d",&node[i].lchild,&node[i].rchild);
      if(node[i].lchild!=-1)isroot[node[i].lchild]=false;
      if(node[i].rchild!=-1)isroot[node[i].rchild]=false;
  }
  for(int i=1;i<=n;i++){
      if(isroot[i]){root=i;
      break;}
  }
    cout<<DFS(root);
    return 0;
}

二刷代码如下
测试点情况;测试点二为只有单个节点的情况
测试点三为单链情况

#include<bits/stdc++.h>
using namespace std;
int n,root;
int vis[25];
struct Node{
    string data;
    int l,r;
}node[25];
string ans;
string dfs(int s){
      if(s==root){
          if(node[s].l!=-1&&node[s].r!=-1) return dfs(node[s].l)+node[s].data+dfs(node[s].r);
          else if(node[s].l==-1&&node[s].r==-1)return node[s].data;
          else return node[s].data+dfs(node[s].r);
      }
   else 
  {     if(node[s].l==-1&&node[s].r==-1)return node[s].data;
        else if(node[s].l!=-1&&node[s].r!=-1)return "("+dfs(node[s].l)+node[s].data+dfs(node[s].r)+")";
        else  return "("+node[s].data+dfs(node[s].r)+")";}
}
int main(){
    
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      { cin>>node[i].data>>node[i].l>>node[i].r;
        if(node[i].l!=-1)vis[node[i].l]=1;
        if(node[i].r!=-1)vis[node[i].r]=1;}
    for(int i=1;i<=n;i++){
        if(vis[i]==0){root=i;
                     break;}
    }
    ans=dfs(root);
    cout<<ans;
    return 0;
   
    
}

注意到题目中字符输出顺序刚好为中序遍历输出顺序,故以此另写一种思路
完善后代码如下

#include<bits/stdc++.h>
using namespace std;
int n,root;
int vis[25];
struct Node{
    string data;
    int l,r;
}node[25];
void dfs(int s){
        if(s==-1)return ;
        if(s!=root&&node[s].r!=-1)cout<<"(";//若当前节点不是叶子节点也不是根节点则添加负号
        dfs(node[s].l);//中序遍历输出
        cout<<node[s].data;
        dfs(node[s].r);
        if(s!=root&&node[s].r!=-1)cout<<")";
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      { cin>>node[i].data>>node[i].l>>node[i].r;
        if(node[i].l!=-1)vis[node[i].l]=1;
        if(node[i].r!=-1)vis[node[i].r]=1;}
    for(int i=1;i<=n;i++){
        if(vis[i]==0){root=i;
                     break;}
    }
    dfs(root);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值