【1130】Infix expression【dfs】

举报
野猪佩奇996 发表于 2022/01/24 00:11:23 2022/01/24
【摘要】 #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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。