当前位置:   article > 正文

括号字符串表示法建立二叉树_用括号法创建树

用括号法创建树
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. #define MAXSIZE 100//最大节点数
  7. using namespace std;
  8. typedef struct BiTnode{
  9. char data;
  10. struct BiTnode * lchild, * rchild;
  11. }BiTnode, * BiTree;
  12. //二叉树的建立
  13. BiTnode* CreateBTree(char* str) {
  14. BiTnode* St[100], * p=NULL, * b;//st作为顺序栈,保存双亲结点
  15. int top = -1, k, j = 0;//top为栈顶指针
  16. char ch;
  17. b = NULL;//初始时二叉链表为空
  18. ch = str[j];
  19. while (ch != '\0')//循环处理,直到str中的每个字符扫描完毕
  20. {
  21. switch (ch)
  22. {
  23. case '(':top++; St[top] = p; k = 1; break;//开始处理左孩子结点
  24. case ')':top--; break;//双亲结点的子树处理完毕
  25. case',':k = 2; break;//处理右孩子结点
  26. default://遇到数据时创建新结点
  27. p = (BiTnode*)malloc(sizeof(BiTnode));
  28. p->data = ch;
  29. p->lchild = p->rchild = NULL;
  30. if (b == NULL)//尚未设置根节点
  31. {
  32. b = p;
  33. }
  34. else
  35. {
  36. switch (k)//新建结点和栈顶双亲结点的关系
  37. {
  38. case 1:St[top]->lchild = p; break;
  39. case 2:St[top]->rchild = p; break;
  40. }
  41. }
  42. }
  43. j++;
  44. ch = str[j];
  45. }
  46. return b;
  47. }
  48. void visit(BiTree t) {
  49. cout << t->data << ' ';
  50. }
  51. int PreOrderTraverse(BiTree t) {
  52. if (t==NULL)
  53. {
  54. return 0;
  55. }
  56. else
  57. {
  58. visit(t);
  59. PreOrderTraverse(t->lchild);
  60. PreOrderTraverse(t->rchild);
  61. return 1;
  62. }
  63. }
  64. int InOrderTraverse(BiTree t) {
  65. if (t == NULL)
  66. {
  67. return 0;
  68. }
  69. else
  70. {
  71. InOrderTraverse(t->lchild);
  72. visit(t);
  73. InOrderTraverse(t->rchild);
  74. return 1;
  75. }
  76. }
  77. int PostOrderTraverse(BiTree t) {
  78. if (t == NULL)
  79. {
  80. return 0;
  81. }
  82. else
  83. {
  84. PostOrderTraverse(t->lchild);
  85. PostOrderTraverse(t->rchild);
  86. visit(t);
  87. return 1;
  88. }
  89. }
  90. int main() {
  91. char str[100] = { '\0' };
  92. while (cin >> str) {
  93. BiTree t = CreateBTree(str);
  94. PostOrderTraverse(t);
  95. cout << endl;
  96. }
  97. return 0;
  98. }

括号字符串表示法是一种用括号来表示二叉树结构的方法。在这种表示法中,每个节点都由一对括号包围,并且子树之间以逗号分隔。具体地说,左括号表示子树的开始,右括号表示子树的结束,逗号表示左右子树之间的分隔。

例如,下面的括号字符串 (A,(B,(D),(E)),(C,(F),())) 表示的二叉树如下图所示:

 

我们可以根据括号字符串建立二叉树的过程如下:

  1. 首先创建一个根节点,并将其入栈。
  2. 从左到右遍历括号字符串,每当遇到一个字符时,如果其为左括号,则说明它是当前节点的左子节点,需要新建一个节点,并将其入栈;如果其为逗号,则跳过;如果其为右括号,则说明当前节点的左右子树已经遍历完毕,需要将其出栈,回到其父节点继续遍历。
  3. 遍历结束后,栈顶元素即为根节点。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/233309
推荐阅读
相关标签
  

闽ICP备14008679号