二叉树创建、先序遍历、中序遍历、后序遍历、树深度

旧城等待, 2022-07-16 03:24 384阅读 0赞

一、概念:

  1. 二叉树遍历:按指定的某条搜索路径访问树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。
  2. 根节点N,按照先遍历左子树L再遍历右子树R的原则,常见的有三种:先序(NLR)、中序(LNR)、后序(LRN)。其中,序是指根节点什么时候被访问。

有时还有提到层序(按层遍历访问)

  1. 例如:下图

20160930224150099

  1. 显然 深度为 4
  2. 求先序遍历: A(以A为根的左子树)(以A为根的右子树)——A(B)(以C为根的先序遍历)——ABCEFG)——A B C D E F G
  3. 同理中序:中间访问根节点:B A D C F E G
  4. 后序遍历:B D F G E C A

二、算法实现

先序遍历操作过程:(递归)

  1. 如果二叉树为空,什么也不做。
  2. 否则:
  3. 1)访问根节点
  4. 2)先序遍历左子树
  5. 3)先序遍历右子树
  6. 递归注意结束条件
  7. //先序遍历递归
  8. int PreOrder(BiTree T){
  9. if(T!=NULL){
  10. Visit(T);
  11. PreOrder(T->lchild);
  12. PreOrder(T->rchild);
  13. }
  14. return 0;
  15. }

中序遍历操作过程:(递归)

  1. 如果二叉树为空,什么也不做。
  2. 否则:
  3. 1)中序遍历左子树
  4. 2)访问根节点
  5. 3)中序遍历右子树
  6. 递归注意结束条件
  7. //中序遍历递归
  8. int InOrder(BiTree T){
  9. if(T!=NULL){
  10. InOrder(T->lchild);
  11. Visit(T);
  12. InOrder(T->rchild);
  13. }
  14. return 0;
  15. }

后序遍历操作过程:(递归)

  1. 如果二叉树为空,什么也不做。
  2. 否则:
  3. 1)后序遍历左子树
  4. 2)后序遍历右子树
  5. 3)访问根节点
  6. 递归注意结束条件
  7. //后序遍历递归
  8. int PostOrder(BiTree T){
  9. if(T!=NULL){
  10. PostOrder(T->lchild);
  11. PostOrder(T->rchild);
  12. Visit(T);
  13. }
  14. return 0;
  15. }
  16. 三种时间复杂度On
  17. 最坏情况下,n个结点深度为n的斜树
  18. 层序遍历( 使用队列)
  19. 完整代码:
  20. #include<stdio.h>
  21. #include<stdlib.h>
  22. typedef char ElemType;//结点数据类型
  23. //二叉树结点
  24. typedef struct BiTNode{
  25. ElemType data;//数据
  26. struct BiTNode *lchild; //左子树指针
  27. struct BiTNode *rchild; //右子树指针
  28. }BiTNode,*BiTree;
  29. //先序输入创建二叉树
  30. int CreatBiTre(BiTree &T){
  31. ElemType x;//输入结点值
  32. scanf("%c",&x);
  33. if(x=='#') T=NULL;//空结点输入空格
  34. else{
  35. T=(BiTree)malloc(sizeof(BiTNode));
  36. if(T==NULL){
  37. printf("OVERFLOW!\n");
  38. exit(1);
  39. }
  40. T->data=x;
  41. CreatBiTre(T->lchild);
  42. CreatBiTre(T->rchild);
  43. }
  44. return 0;
  45. }
  46. void Visit(BiTree T){
  47. if(T->data!='#')
  48. printf("%c ",T->data);
  49. }
  50. //先序遍历递归
  51. int PreOrder(BiTree T){
  52. if(T!=NULL){
  53. Visit(T);
  54. PreOrder(T->lchild);
  55. PreOrder(T->rchild);
  56. }
  57. return 0;
  58. }
  59. //中序遍历递归
  60. int InOrder(BiTree T){
  61. if(T!=NULL){
  62. InOrder(T->lchild);
  63. Visit(T);
  64. InOrder(T->rchild);
  65. }
  66. return 0;
  67. }
  68. //后序遍历递归
  69. int PostOrder(BiTree T){
  70. if(T!=NULL){
  71. PostOrder(T->lchild);
  72. PostOrder(T->rchild);
  73. Visit(T);
  74. }
  75. return 0;
  76. }
  77. //树的深度递归
  78. int TreeHeight(BiTree T){
  79. int height,left,right;
  80. if(T==NULL)
  81. return 0;
  82. left=TreeHeight(T->lchild);
  83. right=TreeHeight(T->rchild);
  84. height=(left>right)?left:right;
  85. return height+1; //算上根结点一层
  86. }
  87. void main(){
  88. BiTree T=NULL;
  89. CreatBiTre(T);
  90. int height;
  91. height=TreeHeight(T);
  92. printf("树的深度: %d\n",height);
  93. printf("先序遍历: ");
  94. PreOrder(T);
  95. printf("\n");
  96. printf("中序遍历: ");
  97. InOrder(T);
  98. printf("\n");
  99. printf("后序遍历: ");
  100. PostOrder(T);
  101. printf("\n");
  102. }
  103. 截图:

20160930230153326

发表评论

表情:
评论列表 (有 0 条评论,384人围观)

还没有评论,来说两句吧...

相关阅读