当前位置:   article > 正文

数据结构与算法 二叉树链式存储与括号表示法的相互转换_二叉树的括号表示字符串转为二叉链存储结构

二叉树的括号表示字符串转为二叉链存储结构

数据结构与算法 二叉树链式存储与括号表示法的相互转换

一、简述

    1、根据括号表示法创建链式二叉树

    2、根据链式二叉树输出对应的括号表示法

二、效果

    

三、源代码

  1. #include <stdio.h>
  2. #include <stdlib.h>//malloc()函数所在库
  3. typedef struct NODE //树节点
  4. {
  5. char data;//节点
  6. struct NODE* lchild;//指向左孩子
  7. struct NODE* rchild;//指向右孩子
  8. }BTNode;
  9. //函数声明
  10. BTNode* CreateBTree(char *str);//根据括号式创建链式二叉树
  11. void PrintBTree(BTNode* root);//根据根节点,输出二叉树的括号表达式
  12. int main(int argc,char* argv)
  13. {
  14. BTNode* root;
  15. root = CreateBTree("A(B(D(,G)),C(E,F))");
  16. PrintBTree(root) ;
  17. getchar();
  18. }
  19. BTNode* CreateBTree(char *str)//根据括号式创建链式二叉树
  20. {
  21. BTNode* root = NULL;//初始化树,tree根节点
  22. BTNode* st[100] = {0} ,*p;//栈st存放要操作的节点,p指向新节点
  23. int top = -1;//栈顶指示
  24. int k = 0;//左右孩子标志
  25. int j = 0;// str索引
  26. char ch = str[j];//取str第一个字符
  27. while(ch!='\0')//当ch不为 '\n'时,进行操作
  28. {
  29. switch(ch)
  30. {
  31. case '(':st[++top] = p;//遇到字符'(',将新节点进栈,合法的字符串里面,'('前面肯定会有节点字符
  32. k = 1;//标志下一个节点处理为当前节点的左孩子
  33. break;
  34. case ')':--top;//遇到字符')'表示当前节点处理完毕,将其出栈
  35. break;
  36. case ',':k = 2;//标志下一个节点处理为当前节点的右孩子
  37. break;
  38. default: p = (BTNode*)malloc(sizeof(BTNode));//节点字符,申请新节点
  39. p->data = ch;//将数据域设置为当前字符
  40. p->lchild = NULL;//指针置空
  41. p->rchild= NULL;//指针置空
  42. if(root == NULL)//如果跟节点为空,将新节点作为根节点
  43. {
  44. root = p;
  45. }
  46. else
  47. {
  48. switch(k)//根据k值将新节点设置为当前操作节点的左孩子或右孩子
  49. {
  50. case 1:st[top]->lchild = p;break;
  51. case 2:st[top]->rchild = p;break;
  52. }
  53. }
  54. break;
  55. }
  56. ch = str[++j] ;//继续处理下一字符
  57. }
  58. return root;
  59. }
  60. void PrintBTree(BTNode* root)//根据根节点,输出二叉树的括号表达式
  61. {
  62. if(root!=NULL)
  63. {
  64. printf("%c",root->data);//打印当前节点
  65. if(root->lchild!=NULL || root->rchild!=NULL)//如果当前节点有孩子
  66. {
  67. printf("(") ;//有孩子必定有左括号
  68. if(root->lchild!=NULL) //如果左孩子不为空,打印左孩子
  69. {
  70. PrintBTree(root->lchild);
  71. }
  72. if(root->rchild!=NULL)//如果右孩子不为空,打印右孩子
  73. {
  74. printf(",");//有右孩子必定有','
  75. PrintBTree(root->rchild);
  76. }
  77. printf(")") ;有孩子必定有右括号
  78. }
  79. }
  80. }

 

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

闽ICP备14008679号