当前位置:   article > 正文

二叉树的遍历

二叉树的遍历

前言

二叉树有三种遍历方式,三种遍历方式的核心都是把一颗二叉树分为根、左子树、右子树三部分。前中后其实说的是根出现的顺序,在二叉树中左子树遍历顺序始终先于右子树。

分析

以这个二叉树为例讲解,一颗二叉树分为根、左子树、右子树。空树是最小单位已经不能再分

最先分为根1、 根1的左子树、根1的右子树

根1的左子树又可以分为 根2、根2的左子树、根2的右子树(为空树)

根1的右子树又可以分为 根4、根4的左子树、根4的右子树

根2的左子树又可以分为根3 、根3的左子树(为空树)根3的右子树(为空树)

根2的右子树是空树是最小单位已经不能再分了

根4的左子树又可以分为根5 、根5的左子树(为空树)根5的右子树(为空树)

根4的右子树又可以分为根6 、根6的左子树(为空树)根6的右子树(为空树)

如下图


温馨提示:空树用N来表示

前序遍历 

根-> 左子树 ->右子树

  • 开始遍历 

根1-> 根2(1的左子树) -> 根3(2的左子树)-> N(3的左子树)-> N(3的右子树)

  • 2的左子树遍历完,返回遍历2的右子树

根1-> 根2(1的左子树) -> 根3(2的左子树)-> N(3的左子树)-> N(3的右子树)->N(2的右子树)

  • 1的左子树遍历完,返回遍历1的右子树

根1-> 根2(1的左子树) -> 根3(2的左子树)-> N(3的左子树)-> N(3的右子树)->N(2的右子树)->根4(1的右子树)->根5(4的左子树)->N(5的左子树)->N(5的右子树)

  • 4的左子树遍历完,返回遍历4的右子树

根1-> 根2(1的左子树) -> 根3(2的左子树)-> N(3的左子树)-> N(3的右子树)->N(2的右子树)->根4(1的右子树)->根5(4的左子树)->N(5的左子树)->N(5的右子树)->根6(4的右子树)->N(6的左子树)->N(6的右子树)

  • 遍历结束,结果:1 2 3 N N N 4 5 N N 6 N N

中序遍历

左子树-> 根-> 右子树

  • 开始遍历 

(根1的左子树)->(根2的左子树)->N(根3的左子树)->根3->N(根3的右子树)

  • 2的左子树遍历完,返回遍历根2和根2的右子树

(根1的左子树)->(根2的左子树)->N(根3的左子树)->根3->N(根3的右子树)->根2->N(2的右子树)

  • 根2和根2的右子树遍历完(也就是根1的左子树遍历完),返回遍历根1和根1的右子树

(根1的左子树)->(根2的左子树)->N(根3的左子树)->根3->N(根3的右子树)->根2->N(2的右子树)->根1->(根4的左子树)->N(根5的左子树)->根5->N(根5的右子树)

  • 4的左子树遍历完,返回遍历根4和他的右子树

(根1的左子树)->(根2的左子树)->N(根3的左子树)->根3->N(根3的右子树)->根2->N(2的右子树)->根1->(根4的左子树)->N(根5的左子树)->根5->N(根5的右子树)->根4->N(根6的左子树)->根6->N(根6的右子树)

  • 遍历结束,结果:N 3 N 2 N 1 N 5 N 4 N 6 N

后序遍历

左子树-> 右子树-> 根

大家可以自行遍历,这里给个参考结果

结果:N N 3 N 2 N N 5 N N 6 4 1

三种遍历结果汇总

代码实现(核心:递归)

定义一个二叉树的结构体,里面包含左子树指针,右子树指针,数据

先造一棵链式二叉树出来

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef int BTDataType;
  4. typedef struct BinaryTreeNode
  5. {
  6. BTDataType data;
  7. struct BinaryTreeNode* left;
  8. struct BinaryTreeNode* right;
  9. }BTNode;
  10. BTNode* BuyNode(BTDataType x)
  11. {
  12. BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
  13. if (newnode == NULL)
  14. {
  15. perror("malloc fail");
  16. return NULL;
  17. }
  18. newnode->left = newnode->right = NULL;
  19. newnode->data = x;
  20. return newnode;
  21. }
  22. BTNode* CreatBinaryTree()
  23. {
  24. BTNode* node1 = BuyNode(1);
  25. BTNode* node2 = BuyNode(2);
  26. BTNode* node3 = BuyNode(3);
  27. BTNode* node4 = BuyNode(4);
  28. BTNode* node5 = BuyNode(5);
  29. BTNode* node6 = BuyNode(6);
  30. node1->left = node2;
  31. node1->right = node4;
  32. node2->left = node3;
  33. node4->left = node5;
  34. node4->right = node6;
  35. return node1;
  36. }
  37. // 二叉树前序遍历
  38. void PreOrder(BTNode* root)
  39. {
  40. if (root == NULL)
  41. {
  42. printf("N ");
  43. return;
  44. }
  45. printf("%d ", root->data);
  46. PreOrder(root->left);
  47. PreOrder(root->right);
  48. }
  49. // 二叉树中序遍历
  50. void InOrder(BTNode* root)
  51. {
  52. if (root == NULL)
  53. {
  54. printf("N ");
  55. return;
  56. }
  57. InOrder(root->left);
  58. printf("%d ", root->data);
  59. InOrder(root->right);
  60. }
  61. // 二叉树后序遍历
  62. void PostOrder(BTNode* root)
  63. {
  64. if (root == NULL)
  65. {
  66. printf("N ");
  67. return;
  68. }
  69. PostOrder(root->left);
  70. PostOrder(root->right);
  71. printf("%d ", root->data);
  72. }
  73. int main()
  74. {
  75. BTNode* root = CreatBinaryTree();
  76. PreOrder(root);
  77. printf("\n");
  78. InOrder(root);
  79. printf("\n");
  80. PostOrder(root);
  81. }

运行结果

以前序为例理解递归

欢迎各位一起学习交流~

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

闽ICP备14008679号