当前位置:   article > 正文

树的括号表示法_树中对于括号字符串怎么看

树中对于括号字符串怎么看
标题:树的括号表示法
时 限:1000 ms
内存限制:3000 K
总时限:3000 ms
描述:
树的括号表示法:
先将根结点放入一对圆括号中,然后把它的子树按由左而右的顺序放入括号中,而对子树也采用同样方法处理:同层子树与它的根结点用圆括号括起来,同层子树之间用逗号隔开,最后用闭括号括起来。例如下图可写成如下形式
(a(b,c,d,e))
a
/ | | \
b c d e
现在给定一个多叉树的括号表示法,要求你创建多叉树,并按层序输出。
输入:
多叉树的括号表示法:字符串
输出:层序输出多叉树
输入样例:
(a(b,c,d,e))
输出样例:abcde

思路:先判断输入的字符串一共有几层,如有levels层则动态初始化levels个队列。

再从第一个字符开始判断字符串中的当前字符串是属于哪一层的,若属于第i层,则插入到第i层的队列当中。

最后,依次将第1层到第levels层队列中的元素出队并输出,则完成层序输出。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef char ElemType;
  5. /队列相关/
  6. typedef struct _QNode
  7. {
  8. ElemType key;
  9. struct _QNode *next;
  10. }QNode;
  11. typedef struct _Queue
  12. {
  13. QNode *front;
  14. QNode *rear;
  15. }Queue;
  16. void InitQueue(Queue &Q)
  17. {
  18. Q.front=NULL;
  19. Q.rear=NULL;
  20. }//InitQueue
  21. bool isEmpty(Queue &Q)
  22. {
  23. if(Q.front==NULL)
  24. return true;
  25. return false;
  26. }//isEmpty
  27. void EnQueue(Queue &Q, ElemType e)
  28. {
  29. QNode *s=(QNode*)malloc(sizeof(QNode));
  30. s->key=e;
  31. s->next=NULL;
  32. if(isEmpty(Q))
  33. {
  34. Q.front=s;
  35. Q.rear=s;
  36. return;
  37. }
  38. else
  39. {
  40. Q.rear->next=s;
  41. Q.rear=s;
  42. }
  43. }//EnQueue
  44. bool DeQueue(Queue &Q,ElemType &e)
  45. {
  46. if(isEmpty(Q))
  47. return false;
  48. else
  49. {
  50. QNode *node=Q.front;
  51. e=node->key;
  52. Q.front=Q.front->next;
  53. if(Q.front==NULL)
  54. {
  55. Q.rear=NULL;
  56. }
  57. free(node);
  58. }
  59. return true;
  60. }//DeQueue
  61. void DestroyQueue(Queue &Q)
  62. {
  63. ElemType temp;
  64. while(DeQueue(Q,temp)){}
  65. }//DestroyQueue
  66. //判断输入的字符串共有几层
  67. int Levels(char *&str)
  68. {
  69. int levels=0,i;
  70. for(i=0;i<strlen(str);i++)
  71. {
  72. if(str[i]=='(')
  73. levels++;
  74. }
  75. return levels;
  76. }
  77. //判断当前的字符e属于哪一层
  78. int Inlevel(char *&str,ElemType e)
  79. {
  80. int i=0,left=0,right=0;
  81. ElemType c;
  82. c=str[0];
  83. while(c!=e)
  84. {
  85. c=str[i];
  86. i++;
  87. if(c=='(') left++;
  88. if(c==')') right++;
  89. }
  90. return left-right;
  91. }
  92. int main()
  93. {
  94. char *str=(char*)malloc(sizeof(char));
  95. scanf("%s",str);
  96. int levels=Levels(str);
  97. //动态分配levels个队列
  98. Queue *Q=(Queue*)malloc(sizeof(Queue)*levels);
  99. int i;
  100. for(i=0;i<levels;i++)
  101. {
  102. InitQueue(Q[i]);
  103. }
  104. for(i=0;i<strlen(str);i++)
  105. {
  106. if(str[i]!=','&&str[i]!='('&&str[i]!=')')
  107. {
  108. //当前字符属于哪个队列,就插入到哪个队列后面
  109. EnQueue(Q[Inlevel(str,str[i])-1],str[i]);
  110. }
  111. }
  112. //从第一层的队列依次出队并输出,即为层序输出
  113. for(i=0;i<levels;i++)
  114. {
  115. ElemType temp;
  116. while(!isEmpty(Q[i]))
  117. {
  118. DeQueue(Q[i],temp);
  119. printf("%c",temp);
  120. }
  121. }
  122. printf("\n");
  123. //销毁所有队列,可没有,但为了程序的健壮性最好有
  124. for(i=0;i<levels;i++)
  125. {
  126. DestroyQueue(Q[i]);
  127. }
  128. return 0;
  129. }


本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/233350
推荐阅读
相关标签
  

闽ICP备14008679号