当前位置:   article > 正文

数据结构和算法——二叉树的遍历(C语言)_二叉树的遍历算法代码c语言

二叉树的遍历算法代码c语言

二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。

目录

一、看图理解:

1.前序遍历

2.中序遍历

 3.后序遍历

4.层序遍历 

 二、代码展示


一、看图理解:

1.前序遍历

前序遍历结果:ABDHIEJCFKG

如图:

前序遍历流程图
要点: 先根 再左 后右    (根指的是每个分叉子树的根结点,并不一定是最上面的,也有可能是相对而言的根)

 思路分析:先遍历根结点A(即先根),接着遍历结点A的左孩子B(即再左),因为B结点也相当于“根结点”(对结点DEHIJ而言),所以接着要遍历结点B的左孩子D,同理接着遍历结点H,然后因为结点H为叶子,不能做“根结点”,所以要进行“后右”,即遍历H的长辈的右孩子I,同理接着遍历结点E......(跟着思路多走几遍就懂啦)

2.中序遍历

中序遍历结果:HDIBEJAFKCG

如图:

中序遍历流程图

 要点先左 再根 后右

 记忆方法:把所有结点间连线删除,所有结点当做实心球向下做自由落体运动落在地上,然后从左向右遍历所有结点。如下图:

 3.后序遍历

后序遍历结果:HIDJEBKFGCA

 如图:

后序遍历流程图

 要点:先左 再右 后根

 记忆方法:用剪刀依次“剪断”结点间连线,每次“剪下”一个结点且从最左边开始,根据左、右、根的优先性选择最优的线“剪断”。(建议多看几遍便于理解)

4.层序遍历 

层序遍历是最好理解的遍历方式,就是从最上面的根结点开始,从上到下的一层一层遍历,每一层从左到右依次遍历就行了。

如图:

层序遍历流程图

 二、代码展示

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef char ElemType;
  4. typedef struct BiTNode
  5. {
  6. char data;
  7. struct BiTNode *lchild, *rchild;
  8. }BiTNode, *BiTree;
  9. //创建一颗二叉树
  10. CreateBiTree(BiTree *T)
  11. {
  12. char c;
  13. scanf("%c",&c);
  14. if(' '==c)
  15. {
  16. *T=NULL;
  17. }
  18. else
  19. {
  20. *T = (BiTNode *)malloc(sizeof(BiTNode));
  21. (*T)->data = c;
  22. CreateBiTree(&(*T)->lchild); //用递归以创建二叉树
  23. CreateBiTree(&(*T)->rchild);
  24. }
  25. }
  26. //访问二叉树结点的具体操作
  27. visit(char c,int level)
  28. {
  29. printf("%c位于第%d层\n",c,level);
  30. }
  31. //前序遍历二叉树
  32. qianxubianlierchashu(BiTree T,int level)
  33. {
  34. if(T)
  35. {
  36. visit(T->data,level); //先根
  37. qianxubianlierchashu(T->lchild,level+1); //再左
  38. qianxubianlierchashu(T->rchild,level+1); //后右
  39. }
  40. }
  41. //中序遍历二叉树
  42. zhongxubianlierchashu(BiTree T,int level)
  43. {
  44. if(T)
  45. {
  46. zhongxubianlierchashu(T->lchild,level+1); //先左
  47. visit(T->data,level); //再根
  48. zhongxubianlierchashu(T->rchild,level+1); //后右
  49. }
  50. }
  51. //后序遍历二叉树
  52. houxubianlierchashu(BiTree T,int level)
  53. {
  54. if(T)
  55. {
  56. houxubianlierchashu(T->lchild,level+1); //先左
  57. houxubianlierchashu(T->rchild,level+1); //再右
  58. visit(T->data,level); //后根
  59. }
  60. }
  61. int main()
  62. {
  63. int level=1;
  64. BiTree T =NULL;
  65. int i;
  66. printf("请选择您想要使用的遍历方法(前序遍历请输入1,中序遍历请输入2,后序遍历请输入3。)");
  67. scanf("%d",&i);
  68. CreateBiTree(&T);
  69. if(i==1)
  70. {
  71. qianxubianlierchashu(T,level);
  72. }
  73. else if(i==2)
  74. {
  75. zhongxubianlierchashu(T,level);
  76. }
  77. else if(i==3)
  78. {
  79. houxubianlierchashu(T,level);
  80. }
  81. return 0;
  82. }

今天的我们很好,明天的我们更好。

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

闽ICP备14008679号