【1130】Infix expression【dfs】
【摘要】
#include<iostream>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#include<algorithm> #include<map>#inclu...
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<string>
using namespace std;
struct node{
string data;
int l,r;//左孩子和右孩子
}a[100];
string dfs(int root){
if(a[root].l==-1 && a[root].r==-1) return a[root].data;
if(a[root].l==-1 && a[root].r!=-1) return"("+a[root].data+
dfs(a[root].r)+")";
if(a[root].l!=-1 && a[root].r!=-1) return "("+dfs(a[root].l)+
a[root].data+dfs(a[root].r)+")";
//注意不存在左不空,右空的情况
}
int main(){
int have[100]={0},n,root=1;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].data>>a[i].l>>a[i].r;
if(a[i].l!=-1) have[a[i].l]=1;
if(a[i].r!=-1) have[a[i].r]=1;
}
while(have[root]==1) root++;
//寻找根结点(孩子结点编号中没有出现过的)
string ans=dfs(root);
if(ans[0]=='(') ans=ans.substr(1,ans.size()-2);
//最后递归返回的ans,最外层可能会被括号包起来,也可能不被包起来。
//要判断一下,如果被包起来,把最外层括号去掉即可
cout<<ans;
system("pause");
return 0;
}
不用尾递归的版本
PS://注意括号的输出应该是在运行到运算符结点的时候输出(结合用例图看看)
//如输出个左括号,然后代码继续往左下跑,跑完回来这个运算符结点,又往右下角跑,跑完回来就输出右括号
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<string>
using namespace std;
//注意括号的输出应该是在运行到运算符结点的时候输出(结合用例图看看)
//如输出个左括号,然后代码继续往左下跑,跑完回来这个运算符结点,又往右下角跑,跑完回来就输出右括号
struct Node{
string data;
int left;
int right;
}node[30];
int n;
bool notRoot[30]={false};
int k=0;
void inorder(int root,int layer){
if(root!=-1){
if(node[root].right!=-1&&layer>0) printf("(");
inorder(node[root].left,layer+1);
cout<<node[root].data;
inorder(node[root].right,layer+1);
if(node[root].right!=-1&&layer>0) printf(")");
}
}
int main(){
scanf("%d",&n);
int lchild,rchild;
for(int i=1;i<=n;i++){
cin>>node[i].data>>lchild>>rchild;
node[i].left=lchild;
node[i].right=rchild;
if(lchild!=-1) notRoot[lchild]=true;
if(rchild!=-1) notRoot[rchild]=true;
}
int root;
for(int i=1;i<=n;i++){
if(!notRoot[i]){
root=i;
break;
}
}
inorder(root,0);
system("pause");
//return 0;
}
文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。
原文链接:andyguo.blog.csdn.net/article/details/103946743
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)