深圳幻海软件技术有限公司 欢迎您!

二叉树相关操作---纯代码实现详解

2023-04-14

目录前言(很重要)二叉树的概念二叉树的相关术语相关操作菜单  二叉树的构造 创建二叉树先序遍历二叉树   中序遍历二叉树 后序遍历二叉树 层次遍历二叉树 二叉树的深度 二叉树的叶子结点数 二

目录

前言 (很重要)

二叉树的概念

二叉树的相关术语

相关操作菜单

  二叉树的构造

 创建二叉树

先序遍历二叉树  

 中序遍历二叉树

 后序遍历二叉树

 层次遍历二叉树

 二叉树的深度

 二叉树的叶子结点数

 二叉树的结点数

整体代码

结果展示

结束语


前言 (很重要)

        大家好,今天给大家带来的是二叉树的相关操作,希望能够给大家带来帮助。

        另外有很多小伙伴们在学习算法的时候,只去学习一些关于算法理论的知识,并不知道自己的代码实战能力如何也不清楚到底对该算法的了解有多深,所以在这里小张给大家推荐一个很棒的平台,在这里有很多的面试和算法题,也有很多的面试和求职的机会,大家可以点击下方链接进入牛客网刷算法真题,提高自己代码实战能力,早日拿到满意的offer!点击这里进入牛客网刷算法和面试真题提高代码实战能力

二叉树的概念

        二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分 。

二叉树的相关术语

①节点:包含一个数据元素及若干指向子树分支的信息 。

②节点的度:一个节点拥有子树的数目称为节点的度 。

③叶子节点:也称为终端节点,没有子树的节点或者度为零的节点 。

④分支节点:也称为非终端节点,度不为零的节点称为非终端节点 。

⑤树的度:树中所有节点的度的最大值 。

⑥节点的层次:从根节点开始,假设根节点为第1层,根节点的子节点为第2层,依此类推,如果某一个节点位于第L层,则其子节点位于第L+1层 。

⑦树的深度:也称为树的高度,树中所有节点的层次最大值称为树的深度  。

相关操作菜单

  1. //菜单
  2. void menu()
  3. {
  4. cout << "\t\t\t******************************************************************" << endl;
  5. cout << "\t\t\t**************** 1.输入-1 退出程序 *******************" << endl;
  6. cout << "\t\t\t**************** 2.输入1 初始化二叉树 *******************" << endl;
  7. cout << "\t\t\t**************** 3.输入2 对二叉树先序遍历 *******************" << endl;
  8. cout << "\t\t\t**************** 4.输入3 对二叉树中序遍历 *******************" << endl;
  9. cout << "\t\t\t**************** 5.输入4 对二叉树后序遍历 *******************" << endl;
  10. cout << "\t\t\t**************** 6.输入5 对二叉树层次遍历 *******************" << endl;
  11. cout << "\t\t\t**************** 7.输入6 二叉树深度 *******************" << endl;
  12. cout << "\t\t\t**************** 8.输入7 二叉树叶子结点数 *******************" << endl;
  13. cout << "\t\t\t**************** 9.输入8 二叉树的结点数 *******************" << endl;
  14. cout << "\t\t\t******************************************************************" << endl;
  15. }

  二叉树的构造

  1. //构造二叉树
  2. typedef struct Binode
  3. {
  4. //数据域
  5. char data;
  6. //定义左孩子和右孩子
  7. struct Binode*lchid, *rchid;
  8. }Binode, *StrBinode;

 创建二叉树

  1. //先序遍历创建二叉树
  2. void creatBinode(StrBinode&T)
  3. {
  4. cin >> ch;
  5. if (ch == '#')
  6. {
  7. //如果输入是#的话就说明根结点就是叶子结点
  8. //就没必要再去进行开辟一个二叉树空间
  9. T = NULL;
  10. }
  11. else
  12. {
  13. T = new Binode;
  14. T->data = ch;
  15. creatBinode(T->lchid);
  16. creatBinode(T->rchid);
  17. }
  18. }

先序遍历二叉树  

  1. //先序遍历二叉树
  2. void visitBinode(StrBinode&T)
  3. {
  4. if (T!=NULL)
  5. {
  6. cout << T->data << " ";
  7. visitBinode(T->lchid);
  8. visitBinode(T->rchid);
  9. }
  10. if(T==NULL)
  11. {
  12. cout << "#" << " ";
  13. }
  14. }

 中序遍历二叉树

  1. //中序遍历二叉树
  2. void MidvisitBinode(StrBinode&T)
  3. {
  4. if (T != NULL)
  5. {
  6. visitBinode(T->lchid);
  7. cout << T->data << " ";
  8. visitBinode(T->rchid);
  9. }
  10. if (T == NULL)
  11. {
  12. cout << "#" << " ";
  13. }
  14. }

 后序遍历二叉树

  1. //后序遍历二叉树
  2. void BackvisitBinode(StrBinode&T)
  3. {
  4. if (T != NULL)
  5. {
  6. visitBinode(T->lchid);
  7. visitBinode(T->rchid);
  8. cout << T->data << " ";
  9. }
  10. if (T == NULL)
  11. {
  12. cout << "#" << " ";
  13. }
  14. }

 层次遍历二叉树

  1. //二叉树的层次遍历
  2. void Levelorder(StrBinode&HT)
  3. {
  4. StrBinode T;
  5. T = new Binode;
  6. //创建一个队列qu
  7. queue<StrBinode> qu;
  8. //将根结点的指针压入队列
  9. qu.push(HT);
  10. //当队列不为空的时候就继续进行循环
  11. while (!qu.empty())
  12. {
  13. //让T里面存放队列中第一个元素的值
  14. T = qu.front();
  15. //C++自带的队列出队的话是删除值不返回值
  16. qu.pop();
  17. //访问出队元素的值
  18. cout << T->data << " ";
  19. //当该节点左孩子不为空的时候就让左孩子入队
  20. if (T->lchid != NULL)
  21. {
  22. qu.push(T->lchid);
  23. }
  24. //当该节点右孩子不为空的时候就让左孩子入队
  25. if (T->rchid != NULL)
  26. {
  27. qu.push(T->rchid);
  28. }
  29. }
  30. }

 二叉树的深度

  1. //二叉树的深度
  2. int deep(StrBinode&T)
  3. {
  4. if (T == NULL)
  5. {
  6. return 0;
  7. }
  8. else
  9. {
  10. int m = deep(T->lchid);
  11. int n = deep(T->rchid);
  12. if (m > n)
  13. {
  14. return (m + 1);
  15. }
  16. else
  17. {
  18. return (n + 1);
  19. }
  20. }
  21. }

 二叉树的叶子结点数

  1. //求二叉树的叶子结点
  2. int leaf(StrBinode&T)
  3. {
  4. //如果是空树
  5. if (T == NULL)
  6. {
  7. //返回0
  8. return 0;
  9. }
  10. //如果是叶子结点
  11. if (T->lchid == NULL && T->rchid == NULL)
  12. {
  13. //返回1
  14. return 1;
  15. }
  16. return leaf(T->lchid) + leaf(T->rchid);
  17. }

 二叉树的结点数

  1. //求二叉树的结点数
  2. int Nodecount(StrBinode&T)
  3. {
  4. //如果是根结点没有数据
  5. if (T == NULL)
  6. {
  7. return 0;
  8. }
  9. else
  10. {
  11. return Nodecount(T->lchid) + Nodecount(T->rchid) + 1;
  12. }
  13. }

整体代码

  1. #include<iostream>
  2. #include<queue>
  3. using namespace std;
  4. char ch = 0;
  5. //构造二叉树
  6. typedef struct Binode
  7. {
  8. //数据域
  9. char data;
  10. //定义左孩子和右孩子
  11. struct Binode*lchid, *rchid;
  12. }Binode, *StrBinode;
  13. //先序遍历创建二叉树
  14. void creatBinode(StrBinode&T)
  15. {
  16. cin >> ch;
  17. if (ch == '#')
  18. {
  19. //如果输入是#的话就说明根结点就是叶子结点
  20. //就没必要再去进行开辟一个二叉树空间
  21. T = NULL;
  22. }
  23. else
  24. {
  25. T = new Binode;
  26. T->data = ch;
  27. creatBinode(T->lchid);
  28. creatBinode(T->rchid);
  29. }
  30. }
  31. //先序遍历二叉树
  32. void visitBinode(StrBinode&T)
  33. {
  34. if (T!=NULL)
  35. {
  36. cout << T->data << " ";
  37. visitBinode(T->lchid);
  38. visitBinode(T->rchid);
  39. }
  40. if(T==NULL)
  41. {
  42. cout << "#" << " ";
  43. }
  44. }
  45. //中序遍历二叉树
  46. void MidvisitBinode(StrBinode&T)
  47. {
  48. if (T != NULL)
  49. {
  50. visitBinode(T->lchid);
  51. cout << T->data << " ";
  52. visitBinode(T->rchid);
  53. }
  54. if (T == NULL)
  55. {
  56. cout << "#" << " ";
  57. }
  58. }
  59. //后序遍历二叉树
  60. void BackvisitBinode(StrBinode&T)
  61. {
  62. if (T != NULL)
  63. {
  64. visitBinode(T->lchid);
  65. visitBinode(T->rchid);
  66. cout << T->data << " ";
  67. }
  68. if (T == NULL)
  69. {
  70. cout << "#" << " ";
  71. }
  72. }
  73. //二叉树的层次遍历
  74. void Levelorder(StrBinode&HT)
  75. {
  76. StrBinode T;
  77. T = new Binode;
  78. //创建一个队列qu
  79. queue<StrBinode> qu;
  80. //将根结点的指针压入队列
  81. qu.push(HT);
  82. //当队列不为空的时候就继续进行循环
  83. while (!qu.empty())
  84. {
  85. //让T里面存放队列中第一个元素的值
  86. T = qu.front();
  87. //C++自带的队列出队的话是删除值不返回值
  88. qu.pop();
  89. //访问出队元素的值
  90. cout << T->data << " ";
  91. //当该节点左孩子不为空的时候就让左孩子入队
  92. if (T->lchid != NULL)
  93. {
  94. qu.push(T->lchid);
  95. }
  96. //当该节点右孩子不为空的时候就让左孩子入队
  97. if (T->rchid != NULL)
  98. {
  99. qu.push(T->rchid);
  100. }
  101. }
  102. }
  103. //二叉树的深度
  104. int deep(StrBinode&T)
  105. {
  106. if (T == NULL)
  107. {
  108. return 0;
  109. }
  110. else
  111. {
  112. int m = deep(T->lchid);
  113. int n = deep(T->rchid);
  114. if (m > n)
  115. {
  116. return (m + 1);
  117. }
  118. else
  119. {
  120. return (n + 1);
  121. }
  122. }
  123. }
  124. //求二叉树的叶子结点
  125. int leaf(StrBinode&T)
  126. {
  127. //如果是空树
  128. if (T == NULL)
  129. {
  130. //返回0
  131. return 0;
  132. }
  133. //如果是叶子结点
  134. if (T->lchid == NULL && T->rchid == NULL)
  135. {
  136. //返回1
  137. return 1;
  138. }
  139. return leaf(T->lchid) + leaf(T->rchid);
  140. }
  141. //求二叉树的结点数
  142. int Nodecount(StrBinode&T)
  143. {
  144. //如果是根结点没有数据
  145. if (T == NULL)
  146. {
  147. return 0;
  148. }
  149. else
  150. {
  151. return Nodecount(T->lchid) + Nodecount(T->rchid) + 1;
  152. }
  153. }
  154. //菜单
  155. void menu()
  156. {
  157. cout << "\t\t\t******************************************************************" << endl;
  158. cout << "\t\t\t**************** 1.输入-1 退出程序 *******************" << endl;
  159. cout << "\t\t\t**************** 2.输入1 初始化二叉树 *******************" << endl;
  160. cout << "\t\t\t**************** 3.输入2 对二叉树先序遍历 *******************" << endl;
  161. cout << "\t\t\t**************** 4.输入3 对二叉树中序遍历 *******************" << endl;
  162. cout << "\t\t\t**************** 5.输入4 对二叉树后序遍历 *******************" << endl;
  163. cout << "\t\t\t**************** 6.输入5 对二叉树层次遍历 *******************" << endl;
  164. cout << "\t\t\t**************** 7.输入6 二叉树深度 *******************" << endl;
  165. cout << "\t\t\t**************** 8.输入7 二叉树叶子结点数 *******************" << endl;
  166. cout << "\t\t\t**************** 9.输入8 二叉树的结点数 *******************" << endl;
  167. cout << "\t\t\t******************************************************************" << endl;
  168. }
  169. int main()
  170. {
  171. int n = 0;
  172. StrBinode T;
  173. menu();
  174. while (cin >> n)
  175. {
  176. if (n < 0)
  177. {
  178. break;
  179. }
  180. switch (n)
  181. {
  182. case 1:
  183. //初始化二叉树
  184. cout << "请输入值对二叉树进行初始化" << endl;
  185. creatBinode(T);
  186. cout << "初始化完成" << endl;
  187. break;
  188. case 2:
  189. //先序遍历
  190. cout << "先序遍历的结果为" << endl;
  191. visitBinode(T);
  192. cout << "先序遍历结束" << endl;
  193. break;
  194. case 3:
  195. //中序遍历
  196. cout << "中序遍历的结果为" << endl;
  197. MidvisitBinode(T);
  198. cout << "中序遍历结束" << endl;
  199. break;
  200. case 4:
  201. //后序遍历
  202. cout << "后序遍历的结果为" << endl;
  203. BackvisitBinode(T);
  204. cout << "后序遍历结束" << endl;
  205. break;
  206. case 5:
  207. //层次遍历
  208. cout << "层次遍历的结果为" << endl;
  209. Levelorder(T);
  210. cout << "层次遍历结束" << endl;
  211. break;
  212. case 6:
  213. cout << "二叉树的深度为:";
  214. cout << deep(T) << endl;
  215. break;
  216. case 7:
  217. cout << "二叉树的叶子结点数为:";
  218. cout << leaf(T) << endl;
  219. break;
  220. case 8:
  221. cout << "二叉树的结点数为;";
  222. cout << Nodecount(T) << endl;
  223. break;
  224. default:
  225. cout << "您的输入有误,请重新输入" << endl;
  226. break;
  227. }
  228. }
  229. return 0;
  230. }

结果展示

结束语

        到这里今天的内容就已经全部结束了,这里的代码是运用C++语言实现的,其他语言的话也大同小异,只要相关的思想掌握了,就能写出来相应的代码最后小张在这里感谢大家的支持 !

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览44032 人正在系统学习中