二叉树遍历(递归版)

男娘i 2022-06-16 04:58 289阅读 0赞

问题描述:
以一定的方式输入数据(本文是以先序遍历的方式输入),程序根据数据进行解析,创建二叉树,然后对二叉树进行操作,主要操作包括以下几种:

  1. 求二叉树的高度
  2. 先序遍历二叉树
  3. 中序遍历二叉树
  4. 后序遍历二叉树
  5. 层序遍历二叉树

先序遍历: 根节点->左子树->右子树
中序遍历: 左子树->根节点->右子树
先序遍历: 左子树->右子树->根节点
层序遍历: 第一层(根节点)->第二层->第三次->….

PS:

  1. 大家可以清楚的看到,先序,中序和后序是相对于根节点而言的
  2. 非递归版本可以查看我的另外一篇文章:
    http://blog.csdn.net/yi_ming_he/article/details/71272568

以下面的例子进行说明:
这里写图片描述

如图所示,根据上面的遍历顺序,我们可以得到以下遍历结果:
先序遍历: a b d h e c f g
中序遍历: h d b e a f c g
后序遍历: h d e b f g c a
层序遍历: a b c d e f g h

参考代码:

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <queue>
  4. typedef struct BiTNode
  5. {
  6. char data;
  7. struct BiTNode* lchild;
  8. struct BiTNode* rchild;
  9. }BiTNode, *Bitree;
  10. void CreateBiTree(Bitree& T)
  11. {
  12. char ch;
  13. scanf_s("%c", &ch);
  14. //按照先序输入输入二叉树中的节点值,其中#表示空树
  15. if (ch == '#')
  16. T = NULL;
  17. else
  18. {
  19. T = (Bitree)malloc(sizeof(BiTNode));
  20. T->data = ch;
  21. CreateBiTree(T->lchild);
  22. CreateBiTree(T->rchild);
  23. }
  24. }
  25. void PreOrderTraverseByRecursion(Bitree T)
  26. {
  27. if (!T)
  28. return;
  29. printf("%c ", T->data);
  30. PreOrderTraverseByRecursion(T->lchild);
  31. PreOrderTraverseByRecursion(T->rchild);
  32. }
  33. void InOrderTraverseByRecursion(Bitree T)
  34. {
  35. if (!T)
  36. return;
  37. InOrderTraverseByRecursion(T->lchild);
  38. printf("%c ", T->data);
  39. InOrderTraverseByRecursion(T->rchild);
  40. }
  41. void PostOrderTraverseByRecursion(Bitree T)
  42. {
  43. if (!T)
  44. return;
  45. PostOrderTraverseByRecursion(T->lchild);
  46. PostOrderTraverseByRecursion(T->rchild);
  47. printf("%c ", T->data);
  48. }
  49. int GetBiTreeHeight(Bitree T)
  50. {
  51. if (!T)
  52. return 0;
  53. int nLeftHeight = GetBiTreeHeight(T->lchild);
  54. int nRightHeight = GetBiTreeHeight(T->rchild);
  55. return (nLeftHeight > nRightHeight ? nLeftHeight : nRightHeight) + 1;
  56. }
  57. void TraverseTreeByLevel(Bitree T, int nLevel)
  58. {
  59. if (!T || nLevel < 1)
  60. return;
  61. if (1 == nLevel)
  62. {
  63. printf("%c ", T->data);
  64. return;
  65. }
  66. TraverseTreeByLevel(T->lchild, nLevel - 1);
  67. TraverseTreeByLevel(T->rchild, nLevel - 1);
  68. }
  69. void LevelOrderTraverseByRecursion(Bitree T)
  70. {
  71. int nHeight = GetBiTreeHeight(T);
  72. for (int i = 1; i <= nHeight; i++)
  73. TraverseTreeByLevel(T, i);
  74. }
  75. int main()
  76. {
  77. Bitree T;
  78. CreateBiTree(T);
  79. printf("树的高度是: %d\n", GetBiTreeHeight(T));
  80. printf("先序遍历(递归):\n");
  81. PreOrderTraverseByRecursion(T);
  82. printf("\n");
  83. printf("中序遍历(递归):\n");
  84. InOrderTraverseByRecursion(T);
  85. printf("\n");
  86. printf("后序遍历(递归):\n");
  87. PostOrderTraverseByRecursion(T);
  88. printf("\n");
  89. printf("层序遍历(递归):\n");
  90. LevelOrderTraverseByRecursion(T);
  91. printf("\n");
  92. return 0;
  93. }

运行结果:
这里写图片描述

发表评论

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

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

相关阅读

    相关

    网上的递归遍历代码很多,这里就不赘述了,说一下思考的角度: 1. 把每一个棵子树都看成是独立的树; 2. 每一个节点都会把递归的代码重新执行一次; 3. 想象压栈的过程

    相关

    二叉树又称为红黑树,是一种常用的数据结构,而二叉树的遍历则是一种非常基本的操作。遍历二叉树的方式有两大类:递归和非递归。递归方式算法较为简便,并且更便于理解,非递归方式则需要对

    相关

    问题描述: 以一定的方式输入数据(本文是以先序遍历的方式输入),程序根据数据进行解析,创建二叉树,然后对二叉树进行操作,主要操作包括以下几种: 1. 求二叉树的高度 2