当前位置:   article > 正文

C++实现二叉树

c++实现二叉树

1.目的:

        1.1 实现二叉树的创建

        1.2 实现二叉树的访问 --- 先中后序访问、层序访问

        1.3 计算树的深度、节点数、复制树

2.案例测试

        2.1 首先创建出一棵二叉树

根据提示依次将要创建的二叉树的 先序遍历结点 输入 ,详细地,如有这样一颗二叉树(#表示空结点):

创建二叉树时应输入其先序遍历序列是 ABDECFG ,更具体地,按如下输入:

接下来,你将看到,输出先序、层序遍历结果等内容,如下:(注:中序后序,操作类似于前序遍历,没有实现)


3.完整代码如下:

  1. /*
  2. 这里要实现的是:
  3. 1.二叉树的创建
  4. 2.树的访问---先中后序访问、再加一个层序访问
  5. 以及一些应用
  6. 1.得到树的深度
  7. 2.得到树的节点数
  8. 3.复制一棵树
  9. 这些都需要用到递归的思想
  10. */
  11. #include<iostream>
  12. using namespace std;
  13. #include<queue>
  14. // 定义二叉树的数据结构
  15. typedef struct treeNode {
  16. string data;
  17. struct treeNode* lChild, * rChild;
  18. }treeNode, * treeLink;
  19. // 根据用户输入,创建一棵二叉树 // 递归的方式创建 // 按照先根遍历的访问顺序,输入数据
  20. void createTree(treeLink& t)
  21. {
  22. string data;
  23. cout << "是否设置为空节点?y -- n" << endl;
  24. string userInput;
  25. cin >> userInput;
  26. if (userInput == "y" || userInput == "Y")
  27. {
  28. t = NULL;
  29. return;
  30. }
  31. else if (userInput == "n" || userInput == "N")
  32. {
  33. cout << "请输入 内容:" << endl;
  34. cin >> data;
  35. }
  36. // 核心代码:
  37. t = new treeNode;
  38. t->data = data;
  39. createTree(t->lChild);
  40. createTree(t->rChild);
  41. }
  42. // 设置访问规则
  43. void visit(const treeLink& t)
  44. {
  45. // 这里做打印输出
  46. cout << t->data << endl;
  47. }
  48. // 访问 -- 根左右 先序顺序
  49. void preOrder(const treeLink& t)
  50. {
  51. if (t == NULL)
  52. return;
  53. visit(t);
  54. preOrder(t->lChild);
  55. preOrder(t->rChild);
  56. }
  57. // 访问 -- 左根右 中序顺序
  58. void midOrder(const treeLink& t)
  59. {
  60. if (t == NULL)
  61. return;
  62. preOrder(t->lChild);
  63. visit(t);
  64. preOrder(t->rChild);
  65. }
  66. // 访问 -- 左右根 后序顺序
  67. void postOrder(const treeLink& t)
  68. {
  69. if (t == NULL)
  70. return;
  71. preOrder(t->lChild);
  72. visit(t);
  73. preOrder(t->rChild);
  74. }
  75. // 访问 -- 树的层序遍历
  76. void floorOrder(const treeLink& t)
  77. {
  78. queue<treeLink> qT;
  79. if (t == NULL)
  80. return;
  81. visit(t);
  82. if (t->lChild != NULL)
  83. qT.push(t->lChild);
  84. if (t->rChild != NULL)
  85. qT.push(t->rChild);
  86. while (!qT.empty())
  87. {
  88. treeLink frontEle = qT.front();
  89. visit(frontEle);
  90. if (frontEle->lChild != NULL)
  91. qT.push(frontEle->lChild);
  92. if (frontEle->rChild != NULL)
  93. qT.push(frontEle->rChild);
  94. qT.pop();
  95. }
  96. }
  97. // 树的深度的计算 // 树的深度等于 左子树、右子树 深度较大者 再加一 ;; 对于左右子树,亦是如此
  98. // 递归的关键是---找出退出循环的条件
  99. int treeDepth(const treeLink& t)
  100. {
  101. if (t->lChild == NULL && t->rChild == NULL)
  102. {
  103. return 1;
  104. }
  105. // 左右子树 深度
  106. int lDepth = treeDepth(t->lChild);
  107. int rDepth = treeDepth(t->rChild);
  108. return lDepth > rDepth ? lDepth + 1 : rDepth + 1;
  109. }
  110. // 树的结点个数的计算 // 树的节点个数 等于 左子树节点个数 + 右子树 节点个数 再加一 ;;对于左右子树亦是如此
  111. int totalNodes(const treeLink& t)
  112. {
  113. if (t == NULL)
  114. {
  115. return 0;
  116. }
  117. // 左右子树 深度
  118. int lNodes = totalNodes(t->lChild);
  119. int rNodes = totalNodes(t->rChild);
  120. return lNodes + rNodes + 1;
  121. }
  122. // 复制一棵树
  123. void copyTree(const treeLink& t, treeLink& newTNode)
  124. {
  125. if (t == NULL) // 节点为空时,返回
  126. {
  127. newTNode = NULL;
  128. return;
  129. }
  130. newTNode = new treeNode;
  131. newTNode->data = t->data;
  132. // 对于左右子节点 亦是如此
  133. copyTree(t->lChild, newTNode->lChild);
  134. copyTree(t->rChild, newTNode->rChild);
  135. }
  136. // 测试案例
  137. void test()
  138. {
  139. treeLink t;
  140. createTree(t);
  141. cout << "先序遍历结果是:" << endl;
  142. preOrder(t);
  143. cout << "--------------------------------" << endl;
  144. cout << "层序遍历结果是" << endl;
  145. floorOrder(t);
  146. cout << "--------------------------------" << endl;
  147. cout << "树的深度是:" << treeDepth(t) << endl;
  148. cout << "树的节点总个数是:" << totalNodes(t) << endl;
  149. cout << "------------- copy -------------------" << endl;
  150. treeLink treeCopied;
  151. copyTree(t, treeCopied);
  152. preOrder(treeCopied);
  153. cout << "复制出来的树的深度是:" << treeDepth(treeCopied) << endl;
  154. cout << "复制出来的树的节点总个数是:" << totalNodes(treeCopied) << endl;
  155. }
  156. int main()
  157. {
  158. test();
  159. system("pause");
  160. return 0;
  161. }

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

闽ICP备14008679号