当前位置:   article > 正文

14-数据结构-二叉树的创建以及前中后遍历,以及结点和叶子节点的计算(C语言)_利用二叉树创建、遍历算法,编写程序,创建一颗二叉树,求二叉树中总结点数和叶子结

利用二叉树创建、遍历算法,编写程序,创建一颗二叉树,求二叉树中总结点数和叶子结

概述:

        二叉树,这里采用孩子链表存储法,即一个数据域和两个左右孩子指针域。随后递归进行遍历即可。在创建二叉树的时候,先创建各个二叉树结点(这里的结点采用动态分配,因此结点为指针变量),随后,再根据逻辑结构图,手动通过左右指针域,链接到对应位置即可。

代码如下:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. //二叉树结点
  5. typedef struct BTnode
  6. {
  7. int data;
  8. struct BTnode *lchild,*rchild;
  9. }BTnode;
  10. BTnode* BuyNode(int x)
  11. {
  12. //创建树的结点空间,动态分配。
  13. BTnode* node =(BTnode*)malloc(sizeof(BTnode));
  14. //给结点赋值,指针域置空
  15. node->data=x;
  16. node->lchild=NULL;
  17. node->rchild=NULL;
  18. return node;
  19. }
  20. //创建二叉树
  21. BTnode* CreatTree()
  22. {
  23. //创建树的结点
  24. BTnode* node1 =BuyNode(1);//因为BuyNode是动态分配的空间,因此用指针接收
  25. BTnode* node2 =BuyNode(2);
  26. BTnode* node3 =BuyNode(3);
  27. BTnode* node4 =BuyNode(4);
  28. BTnode* node5 =BuyNode(5);
  29. //手动链接起来。
  30. node1->lchild=node2;
  31. node1->rchild=node3;
  32. node2->lchild=node4;
  33. node2->rchild=node5;
  34. //链接完毕,返回头指针,即根结点
  35. return node1;
  36. }
  37. //打印树-前序遍历
  38. void PreOrder(BTnode* root)
  39. {
  40. if(root == NULL)
  41. {
  42. printf("# ");
  43. return;//返回调用的上一级
  44. }
  45. printf("%d ",root->data);
  46. PreOrder(root->lchild);
  47. PreOrder(root->rchild);
  48. }
  49. void InOrder(BTnode* root)//中序遍历
  50. {
  51. if(root == NULL)
  52. {
  53. printf("# ");
  54. return;//返回调用的上一级
  55. }
  56. InOrder(root->lchild); //
  57. printf("%d ",root->data);//
  58. InOrder(root->rchild);//
  59. }
  60. void PostOrder(BTnode* root)//后序遍历
  61. {
  62. if(root == NULL)
  63. {
  64. printf("# ");
  65. return;//返回调用的上一级
  66. }
  67. PostOrder(root->lchild);//
  68. PostOrder(root->rchild);//
  69. printf("%d ",root->data);//
  70. }
  71. //计算树的结点,分治思想,分工,最后汇总。
  72. int BTtreeSize(BTnode* root)
  73. {
  74. if(root ==NULL)//树是空的,就返回0
  75. return 0;
  76. else//不是空的,就进行左右子树遍历再加1,因为要给本身加上。空根不加一,但这里非空,必定+1
  77. {
  78. //递归到叶子节点时,叶子节点的左右子树都为空,返回00+0+1=1,因此叶子节点再往上一层返回即可。
  79. return BTtreeSize(root->lchild)+BTtreeSize(root->rchild)+1;
  80. }
  81. }
  82. //计算树的叶子节点
  83. int LeafSizes(BTnode* root)
  84. {
  85. //是空根就返回0
  86. if(root ==NULL)
  87. return 0;
  88. //符合叶子结点特征,即结点的左右子树均为空,则返回1,即记录上
  89. if(root->lchild ==NULL && root->rchild==NULL )
  90. return 1;
  91. else
  92. //都不符合,便进入左右子树,进行递归计算,最后汇总即可。
  93. return LeafSizes(root->lchild)+LeafSizes(root->rchild);
  94. //实在不明白,画个递归图,就明白了。
  95. }
  96. int main()
  97. {
  98. BTnode* root=CreatTree();
  99. //遍历递归打印时,每个结点调用结束,销毁空间,返回上一级调用位置。
  100. //直到所有结点遍历结束,临时空间逐个销毁。
  101. printf("前序遍历:");
  102. PreOrder(root);
  103. printf("\n中序遍历:");
  104. InOrder(root);
  105. printf("\n后序遍历:");
  106. PostOrder(root);
  107. //计算树的结点
  108. int count=BTtreeSize(root);
  109. printf("\n树有%d个结点",count);
  110. int leafcount=LeafSizes(root);
  111. printf("\n树有%d个叶子结点",leafcount);
  112. return 0;
  113. }

结果:

 

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

闽ICP备14008679号