当前位置:   article > 正文

C语言实现二叉树链式存储_二叉树链式存储结构代码

二叉树链式存储结构代码

前序遍历创建树:

  1. bitree *creatbitree()//前序遍历的数值来创建树——递归
  2. {
  3. char ch;
  4. bitree *root;
  5. ch=getchar();//用于接收输入的数值
  6. if(ch=='*') return NULL;//用*来判断是否为空
  7. else{
  8. root=(bitree *)malloc(sizeof(bitree));
  9. root->data=ch;//赋值
  10. root->lchild=creatbitree();//左子树
  11. root->rchild=creatbitree();//右子树
  12. }
  13. return root;
  14. }
  15. [点击并拖拽以移动]

测量树的深度

  1. int depthbitree(bitree *T)//测量树的深度
  2. {
  3. if(T==NULL) return 0;
  4. else{
  5. int leftheighter=depthbitree(T->lchild);
  6. int rightheighter=depthbitree(T->rchild);
  7. return (leftheighter > rightheighter?leftheighter+1:rightheighter+1);
  8. }
  9. }

计算树的叶子和总结点数 :

  1. int leaf_count(bitree *T)//测量叶子的数量
  2. {
  3. if(T==NULL) return 0;
  4. else if(!T->lchild&&!T->rchild)//如果左右结点都为空则他就是叶子结点
  5. return 1;
  6. else return leaf_count(T->lchild)+leaf_count(T->rchild);
  7. }
  8. int countbitree(bitree *T)//测量总的结点个数
  9. {
  10. if(T==NULL)
  11. return 0;
  12. else{
  13. return 1+countbitree(T->lchild)+countbitree(T->rchild);
  14. }
  15. }

前序、中序、后续遍历输出:

  1. int preorder(bitree *T)//前序遍历序列 (根左右)
  2. {
  3. if(T==NULL)
  4. return 0;
  5. else{
  6. printf("%c ",T->data);//先输出根节点
  7. preorder(T->lchild);
  8. preorder(T->rchild);
  9. }
  10. }
  11. int inorder(bitree *T)//中序遍历序列 (左根右)
  12. {
  13. if(T==NULL)
  14. return 0;
  15. else{
  16. inorder(T->lchild);//先输出左孩子
  17. printf("%c ",T->data);
  18. inorder(T->rchild);
  19. }
  20. }
  21. int postorder(bitree *T)//后序遍历序列 (左右根)
  22. {
  23. if(T==NULL)
  24. return 0;
  25. else{
  26. postorder(T->lchild);//先输出左孩子
  27. postorder(T->rchild);
  28. printf("%c ",T->data);
  29. }
  30. }

广义表形式输出:

  1. void displaybitree(bitree *T)//广义表输出
  2. {
  3. if (T == NULL) return;
  4. printf("%c", T->data);
  5. if (T->lchild == NULL && T->rchild == NULL)//判断是否是叶子节点
  6. return;
  7. printf("(");
  8. displaybitree(T->lchild);
  9. printf(",");
  10. displaybitree(T->rchild);
  11. printf(")");
  12. return;
  13. }

删除树

  1. bitree *Delete(bitree *T)//删除树
  2. {
  3. if(T->lchild)
  4. Delete(T->lchild);
  5. else if(T->rchild)
  6. Delete(T->rchild);
  7. else
  8. free(T);
  9. }

 完整代码如下:

  1. #include"stdio.h"
  2. #include"stdlib.h"
  3. typedef int datatype;
  4. typedef struct innode
  5. {
  6. datatype data;
  7. struct innode *lchild,*rchild;
  8. }bitree;
  9. int i,j;
  10. bitree *creatbitree()//前序遍历的数值来创建树——递归
  11. {
  12. char ch;
  13. bitree *root;
  14. ch=getchar();//用于接收输入的数值
  15. if(ch=='*') return NULL;//用*来判断是否为空
  16. else{
  17. root=(bitree *)malloc(sizeof(bitree));
  18. root->data=ch;//赋值
  19. root->lchild=creatbitree();//左子树
  20. root->rchild=creatbitree();//右子树
  21. }
  22. return root;
  23. }
  24. int depthbitree(bitree *T)//测量树的深度
  25. {
  26. if(T==NULL) return 0;
  27. else{
  28. int leftheighter=depthbitree(T->lchild);
  29. int rightheighter=depthbitree(T->rchild);
  30. return (leftheighter > rightheighter?leftheighter+1:rightheighter+1);
  31. }
  32. }
  33. int leaf_count(bitree *T)//测量叶子的数量
  34. {
  35. if(T==NULL) return 0;
  36. else if(!T->lchild&&!T->rchild)//如果左右结点都为空则他就是叶子结点
  37. return 1;
  38. else return leaf_count(T->lchild)+leaf_count(T->rchild);
  39. }
  40. int countbitree(bitree *T)//测量总的结点个数
  41. {
  42. if(T==NULL)
  43. return 0;
  44. else{
  45. return 1+countbitree(T->lchild)+countbitree(T->rchild);
  46. }
  47. }
  48. bitree *copy(bitree *T)//复制树
  49. {
  50. if(T==NULL)
  51. return NULL;
  52. else{
  53. bitree *temp;
  54. temp=(bitree *)malloc(sizeof(bitree));
  55. temp->data=T->data;
  56. temp->lchild=copy(T->lchild);
  57. temp->rchild=copy(T->rchild);
  58. return temp;
  59. }
  60. }
  61. int preorder(bitree *T)//前序遍历序列 (根左右)
  62. {
  63. if(T==NULL)
  64. return 0;
  65. else{
  66. printf("%c ",T->data);//先输出根节点
  67. preorder(T->lchild);
  68. preorder(T->rchild);
  69. }
  70. }
  71. int inorder(bitree *T)//中序遍历序列 (左根右)
  72. {
  73. if(T==NULL)
  74. return 0;
  75. else{
  76. inorder(T->lchild);//先输出左孩子
  77. printf("%c ",T->data);
  78. inorder(T->rchild);
  79. }
  80. }
  81. int postorder(bitree *T)//后序遍历序列 (左右根)
  82. {
  83. if(T==NULL)
  84. return 0;
  85. else{
  86. postorder(T->lchild);//先输出左孩子
  87. postorder(T->rchild);
  88. printf("%c ",T->data);
  89. }
  90. }
  91. void displaybitree(bitree *T)//广义表输出
  92. {
  93. if (T == NULL) return;
  94. printf("%c", T->data);
  95. if (T->lchild == NULL && T->rchild == NULL)//判断是否是叶子节点
  96. return;
  97. printf("(");
  98. displaybitree(T->lchild);
  99. printf(",");
  100. displaybitree(T->rchild);
  101. printf(")");
  102. return;
  103. }
  104. bitree *Delete(bitree *T)//删除树
  105. {
  106. if(T->lchild)
  107. Delete(T->lchild);
  108. else if(T->rchild)
  109. Delete(T->rchild);
  110. else
  111. free(T);
  112. }
  113. main()
  114. {
  115. bitree *T;
  116. T=(bitree *)malloc(sizeof(bitree));
  117. T->lchild=NULL;
  118. T->rchild=NULL;
  119. puts("请输入树的前序遍历序列");
  120. T=creatbitree();
  121. int n=depthbitree(T);
  122. int m=leaf_count(T);
  123. int l=countbitree(T);
  124. puts("树创建完成");
  125. puts("前序输出为");
  126. printf("\t\t");
  127. preorder(T);
  128. puts("\n中序输出为");
  129. printf("\t\t");
  130. inorder(T);
  131. puts("\n后序输出为");
  132. printf("\t\t");
  133. postorder(T);
  134. puts("\n广义表输出");
  135. printf("\t\t");
  136. putchar('(');
  137. displaybitree(T);
  138. printf("\n高度%d\n叶子%d\n总结点%d\n",n,m,l);
  139. Delete(T);
  140. puts("删除成功");
  141. }

 

 

 

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

闽ICP备14008679号