【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...

  
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<math.h>
  5. #include<string.h>
  6. #include<algorithm>
  7. #include<map>
  8. #include<vector>
  9. #include<queue>
  10. #include<string>
  11. using namespace std;
  12. struct node{
  13. string data;
  14. int l,r;//左孩子和右孩子
  15. }a[100];
  16. string dfs(int root){
  17. if(a[root].l==-1 && a[root].r==-1) return a[root].data;
  18. if(a[root].l==-1 && a[root].r!=-1) return"("+a[root].data+
  19. dfs(a[root].r)+")";
  20. if(a[root].l!=-1 && a[root].r!=-1) return "("+dfs(a[root].l)+
  21. a[root].data+dfs(a[root].r)+")";
  22. //注意不存在左不空,右空的情况
  23. }
  24. int main(){
  25. int have[100]={0},n,root=1;
  26. cin>>n;
  27. for(int i=1;i<=n;i++){
  28. cin>>a[i].data>>a[i].l>>a[i].r;
  29. if(a[i].l!=-1) have[a[i].l]=1;
  30. if(a[i].r!=-1) have[a[i].r]=1;
  31. }
  32. while(have[root]==1) root++;
  33. //寻找根结点(孩子结点编号中没有出现过的)
  34. string ans=dfs(root);
  35. if(ans[0]=='(') ans=ans.substr(1,ans.size()-2);
  36. //最后递归返回的ans,最外层可能会被括号包起来,也可能不被包起来。
  37. //要判断一下,如果被包起来,把最外层括号去掉即可
  38. cout<<ans;
  39. system("pause");
  40. return 0;
  41. }

不用尾递归的版本

PS://注意括号的输出应该是在运行到运算符结点的时候输出(结合用例图看看)
//如输出个左括号,然后代码继续往左下跑,跑完回来这个运算符结点,又往右下角跑,跑完回来就输出右括号


  
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<math.h>
  5. #include<string.h>
  6. #include<algorithm>
  7. #include<map>
  8. #include<vector>
  9. #include<queue>
  10. #include<string>
  11. using namespace std;
  12. //注意括号的输出应该是在运行到运算符结点的时候输出(结合用例图看看)
  13. //如输出个左括号,然后代码继续往左下跑,跑完回来这个运算符结点,又往右下角跑,跑完回来就输出右括号
  14. struct Node{
  15. string data;
  16. int left;
  17. int right;
  18. }node[30];
  19. int n;
  20. bool notRoot[30]={false};
  21. int k=0;
  22. void inorder(int root,int layer){
  23. if(root!=-1){
  24. if(node[root].right!=-1&&layer>0) printf("(");
  25. inorder(node[root].left,layer+1);
  26. cout<<node[root].data;
  27. inorder(node[root].right,layer+1);
  28. if(node[root].right!=-1&&layer>0) printf(")");
  29. }
  30. }
  31. int main(){
  32. scanf("%d",&n);
  33. int lchild,rchild;
  34. for(int i=1;i<=n;i++){
  35. cin>>node[i].data>>lchild>>rchild;
  36. node[i].left=lchild;
  37. node[i].right=rchild;
  38. if(lchild!=-1) notRoot[lchild]=true;
  39. if(rchild!=-1) notRoot[rchild]=true;
  40. }
  41. int root;
  42. for(int i=1;i<=n;i++){
  43. if(!notRoot[i]){
  44. root=i;
  45. break;
  46. }
  47. }
  48. inorder(root,0);
  49. system("pause");
  50. //return 0;
  51. }

 

文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。

原文链接:andyguo.blog.csdn.net/article/details/103946743

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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