• 面试算法 二叉树的遍历,方法 :迭代 ,前序遍历: 中序遍历: 后序遍历: 层序遍历


    1.题目:二叉树遍历
    前序遍历:根左右
    中序遍历:左根右
    后序遍历:左右根
    层序遍历:从上往下、从左往右

    迭代遍历:使用迭代方法实现递归函数

    与递归等价     morris遍历


    2.算法:

    迭代算法


    3.算法思想: (这东西讲不清    bibi  看视频!!!)

    1.前序遍历: 首先在根开始向左遍历,到那个节点就打印数据,在递归左边节点,在递归右边节点,

    2.中序遍历:首先在根开始遍历,遍历到最左边的时候才开始打印数据,因为是先打印左边啊!所以我们需要到最左边。然后递归右节点

    3.后序遍历: 首先我们先遍历到最左边,然后遍历最右边,最后打印数据。

    4.层序遍历: 首先我们,需要用到队列,的先进先出的特性来,实现。(开代码!!!不知道怎么说!!!)
     


    代码:

    1. /*************************************************
    2. 作者:She001
    3. 时间:2022/9/31
    4. 题目:二叉树遍历
    5. 前序遍历:根左右
    6. 中序遍历:左根右
    7. 后序遍历:左右根
    8. 层序遍历:从上往下、从左往右
    9. 递归遍历:使用递归方法遍历
    10. 迭代遍历:使用迭代方法实现递归函数,
    11. 与递归等价 morris遍历
    12. ***************************************************/
    13. #include<bits/stdc++.h>
    14. using namespace std;
    15. typedef struct student
    16. {
    17. int a;
    18. struct student * left;
    19. struct student * right;
    20. int shendu;//树的深度
    21. }node; //指针类型的
    22. /*//二叉树模型
    23. a1
    24. a2 a3
    25. a4 a5 a6 a7
    26. a8
    27. a9
    28. */
    29. ///
    30. //迭代遍历的方法实现
    31. /*
    32. 前序遍历:根左右
    33. 中序遍历:左根右
    34. 后序遍历:左右根
    35. 层序遍历:从上往下、从左往右
    36. */
    37. void fangfa_2(node * t)//中序遍历
    38. {
    39. if(t ==NULL)
    40. {
    41. printf("空间开辟失败!\n");
    42. return;
    43. }
    44. //准备一个栈
    45. node* stack[100];
    46. int stack_num=-1 ;
    47. node * temp = t;
    48. while(stack_num!=-1 || temp!=NULL )
    49. {
    50. while(temp!=NULL)
    51. {
    52. stack[++stack_num]=temp;
    53. temp=temp->left;
    54. }
    55. if(stack_num!=-1) //注意打印过的数据,其指针不再进栈 数据思路还行
    56. {
    57. temp=stack[stack_num--];
    58. cout<<temp->a<<" "; //先打左节点 再打本身
    59. temp=temp->right;
    60. }
    61. }
    62. }
    63. void fangfa_3(node * t)//后序列
    64. {
    65. if(t ==NULL)
    66. {
    67. printf("空间开辟失败!\n");
    68. return;
    69. }
    70. //准备一个栈
    71. node *stack[100];
    72. int stack_num=-1 ;
    73. node* temp = t;
    74. node* plastVisit=NULL; //访问标记
    75. while(temp!=NULL )
    76. {
    77. stack[++stack_num]=temp;
    78. temp=temp->left; //先移到 最左边
    79. }
    80. while(stack_num!=-1)
    81. {
    82. temp=stack[stack_num--];
    83. if(temp->right==NULL || temp->right==plastVisit)
    84. {
    85. cout<<temp->a<<" "; //到了节点打印数据 或者右边的树已经打过
    86. plastVisit=temp; //标记这个最右的节点已经走过
    87. }
    88. else
    89. {
    90. stack[++stack_num]=temp;
    91. temp=temp->right;
    92. while(temp!=NULL)
    93. {
    94. stack[++stack_num]=temp;
    95. temp=temp->left;
    96. }
    97. }
    98. }
    99. }
    100. void fangfa_1(node * t)//前序
    101. {
    102. if(t ==NULL)
    103. {
    104. printf("空间开辟失败!\n");
    105. return;
    106. }
    107. //准备一个栈
    108. node* stack[100];
    109. int stack_num=-1 ;
    110. node* temp = t;
    111. while(stack_num!=-1 || temp!=NULL) //开始因为 节点不是空的所以可以进去
    112. {
    113. while(temp!=NULL)
    114. {
    115. cout<<temp->a<<" ";
    116. stack[++stack_num] = temp; //走过的路需要记载 进栈
    117. temp=temp->left;
    118. }
    119. if(stack_num!=-1)
    120. {
    121. temp=stack[stack_num];
    122. stack_num--;
    123. temp=temp->right; //看看这个节点的右节点
    124. }
    125. }
    126. }
    127. void fangfa_4(node* root)//cengxi
    128. {
    129. if(root==NULL)
    130. {
    131. return;
    132. }
    133. queue<node * >q;
    134. q.push(root);
    135. while(!q.empty())//不为空就执行
    136. {
    137. node* hh=q.front();//获取即将出队的数据
    138. cout<<hh->a<<" ";//打印数据
    139. q.pop();//出队
    140. if(hh->left!=NULL)
    141. {
    142. q.push(hh->left);
    143. }
    144. if(hh->right!=NULL)
    145. {
    146. q.push(hh->right);
    147. }
    148. }
    149. }
    150. int main()
    151. {
    152. //数据初始化,建立树
    153. struct student *a1 =new struct student;
    154. struct student *a2 =new struct student;
    155. struct student *a3 =new struct student;
    156. struct student *a4 =new struct student;
    157. struct student *a5 =new struct student;
    158. struct student *a6 =new struct student;
    159. struct student *a7 =new struct student;
    160. struct student *a8 =new struct student;
    161. struct student *a9 =new struct student;
    162. //数值的赋值
    163. a1->a=1;
    164. a2->a=2;
    165. a3->a=3;
    166. a4->a=4;
    167. a5->a=5;
    168. a6->a=6;
    169. a7->a=7;
    170. a8->a=8;
    171. a9->a=9;
    172. //节点的连接
    173. a1->left=a2;
    174. a1->right=a3;
    175. a2->left=a4;
    176. a2->right=a5;
    177. a3->left=a6;
    178. a3->right=a7;
    179. a6->left=a8;
    180. a8->right=a9;
    181. //节点为空的设置
    182. a4->left=NULL;
    183. a4->right=NULL;
    184. a5->left=NULL;
    185. a5->right=NULL;
    186. a8->left=NULL;
    187. a9->left=NULL;
    188. a9->right=NULL;
    189. a6->right=NULL;
    190. a7->left=NULL;
    191. a7->right=NULL;
    192. //打印前序遍历
    193. cout<<"前序遍历: ";
    194. fangfa_1(a1);
    195. cout<<endl;
    196. //打印中序遍历
    197. cout<<"中序遍历: ";
    198. fangfa_2(a1);
    199. cout<<endl;
    200. //打印后序遍历
    201. cout<<"后序遍历 : ";
    202. fangfa_3(a1);
    203. cout<<endl;
    204. //打印层序遍历
    205. cout<<"层序遍历 : ";
    206. fangfa_4(a1);
    207. cout<<endl;
    208. //释放空间
    209. delete a1;
    210. delete a2;
    211. delete a3;
    212. delete a4;
    213. delete a5;
    214. delete a6;
    215. delete a7;
    216. delete a8;
    217. delete a9;
    218. return 0;
    219. }

  • 相关阅读:
    Redis入门(基础篇)笔记
    【408专项篇】C语言笔记-第五章(一维数组与字符数组)
    Spring Boot(六十六):集成Alibaba Druid 连接池
    Java中Comparable接口的使用,匿名内部类的调用
    Web Api的两种风格,实战的建议 / 附:ABP中的处理
    Lumiprobe生物素亚磷酰胺(羟脯氨酸)说明书
    斐波那契数列问题
    【预训练语言模型】 使用Transformers库进行BERT预训练
    Postgresql源码(67)LWLock锁的内存结构与初始化
    Android 13 Beta 版发布,诸多亮点不容错过
  • 原文地址:https://blog.csdn.net/she666666/article/details/126645912