当前位置:   article > 正文

二叉树 - 用嵌套括号表示法建立和输出一棵二叉树(C语言)_二叉树括号表示法输出二叉树算法

二叉树括号表示法输出二叉树算法

 

实现方法如下:

(1)从左到右扫描树的括号表示;

(2)每当遇到左括号时,其前一个结点进栈,并读入下一个符号;

(3)每当遇到右括号时,栈顶元素出栈。说明以栈顶元素为根的树(子树)构造完毕,此时若栈为空,算法结束,否则读入下一个符号

(4)每当遇到结点时,则它一定为栈顶元素的子女,将其挂到栈顶元素的某子女位置上,并读入下一个符号;

 

 

(5)每当遇到“,”,则略过该符号,并读入下一个符号。

 

 

如图所示:

    

 

完整代码如下:

  1. /* 二叉树 - 根据嵌套括号表示法的字符串生成链式存储的二叉树 */
  2. #include <iostream>
  3. #include <malloc.h>
  4. using namespace std;
  5. const int MaxSize = 50;
  6. typedef char ElementType; //typedef用来给数据类型char起别名(ElementType)
  7. typedef struct bitnode
  8. {
  9. ElementType data;
  10. struct bitnode *left, *right;
  11. } bitnode, *bitree; //bitree为指向bitnode这种自定义数据的指针
  12. //函数声明
  13. void CreateTree(bitree &b, char str[]); //根据嵌套括号表示法的字符串生成链式存储的二叉树
  14. void PrinTree(bitree b); //以嵌套括号表示法输出一棵树
  15. bitree FreeTree(bitree b); //释放空间
  16. //根据嵌套括号表示法的字符串生成链式存储的二叉树
  17. void CreateTree(bitree &b, char str[])
  18. {
  19. char ch;
  20. bitree stack[MaxSize],p; //stack[MaxSize]为指针数组,其每一个元素都为指向bitnode这种结构的指针,p为临时指针
  21. int top = -1, k, j = 0; //top为栈顶指针、k决定谁是左、右孩子、j为str指针
  22. while( (ch = str[j++]) != '\0' )
  23. {
  24. switch(ch)
  25. {
  26. case '(':
  27. top++;
  28. stack[top] = p; //根节点入栈
  29. k = 1; //1为左孩子
  30. break;
  31. case ',':
  32. k = 2; //2为右孩子
  33. break;
  34. case ')':
  35. top--; //根节点出栈
  36. break;
  37. default:
  38. p = (bitree)malloc(sizeof(bitnode));
  39. p->data = ch;
  40. p->left = p->right = NULL;
  41. if( b == NULL ) //树为空时
  42. b = p;
  43. else //树非空时
  44. {
  45. switch(k)
  46. {
  47. case 1:
  48. stack[top]->left = p; //根节点的左孩子
  49. break;
  50. case 2:
  51. stack[top]->right = p; //根节点的右孩子
  52. break;
  53. }
  54. }
  55. }
  56. }
  57. }
  58. //以嵌套括号表示法输出一棵二叉树
  59. void PrinTree(bitree b)
  60. {
  61. if( b )
  62. {
  63. cout << b->data; //访问根节点
  64. if( b->left != NULL || b->right != NULL )
  65. {
  66. cout << "(";
  67. PrinTree(b->left); //递归处理左子树
  68. if(b->right != NULL)
  69. cout << ",";
  70. PrinTree(b->right); //递归处理右子树
  71. cout << ")";
  72. }
  73. }
  74. }
  75. bitree FreeTree(bitree b)
  76. {
  77. if( b != NULL )
  78. {
  79. FreeTree(b->left); //递归释放左子树
  80. FreeTree(b->right); //递归释放右子树
  81. free(b); //释放根节点
  82. b = NULL; //释放指向根节点的指针
  83. }
  84. return b; //return NULL;
  85. }
  86. int main()
  87. {
  88. char str[] = "a(b(c),d(e(,f),g))";
  89. bitree root = NULL; //不要忘记初始化
  90. CreateTree(root,str);
  91. cout << "str字符串:" << str << endl;
  92. cout << "嵌套表示法:";
  93. PrinTree(root);
  94. cout << endl;
  95. root = FreeTree(root);
  96. if( root == NULL )
  97. cout << "释放成功" << endl;
  98. return 0;
  99. }

运行结果如下:

 

 

 

后记:

 

最近在看一本书,是红衣教主周鸿祎写的《我的互联网方法论》,他讲到了互联网的本质——Free,没错,就是免费,Internet这条信息高速公路不仅仅需要哪些专业人士去建造,而且需要我们每一个人来贡献出一些东西,我们需要站在巨人的肩膀上去眺望未来,编程也是这样,不要刀耕火种,我们需要交流,相互交流,这也是我为什么要花我的一部分时间来写博客的原因,我所写的这些东西也许都是上个世纪的产物了,很多人都在写,但是我希望我们每个人都来写,因为分享知识从来都是一件令人快乐的事。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/233382?site
推荐阅读
相关标签
  

闽ICP备14008679号