给一个二叉树,输出中缀表达式,且加上括号表示运算的优先级~~。
参考柳神的做法
柳婼代码链接
坑点如下
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;
}