当前位置:   article > 正文

【二叉树】遍历与创建 前序中序后续 递归实现_后续递归建立二叉树

后续递归建立二叉树

树基本概念

         二叉树:每个结点最多只能有2个子树,如下图所示:

遍历二叉树:

  • 分类

        (1)先序遍历:根 ->左 ->右 的顺序 先遍历根节点,再遍历左子树,最后遍历右子树,如下图所示。

       

 图示为举例进行先序遍历顺序

        (2)中序遍历:左 -> 根 ->右的顺序。

        (3)后序遍历:左 -> 右-> 根的顺序

        (4)层次遍历:从上到下、从左到右的顺序,如图所示:

 图示为举例进行层遍历顺序

  • 先序、中序、后序递归遍历代码(文章最底部有完整代码)

递归实现

  1. //先序遍历输出二叉树
  2. //先、中、后都是针对于根而言所起的名字
  3. void PreOrder(node* root)
  4. {
  5. if (root != NULL)
  6. {
  7. printf("%c", root->value);
  8. PreOrder(root->left);
  9. PreOrder(root->right);
  10. }
  11. }
  12. //后序
  13. void PostOrder(node* root)
  14. {
  15. if (root != NULL)
  16. {
  17. PostOrder(root->left);
  18. PostOrder(root->right);
  19. printf("%c", root->value);
  20. }
  21. }
  22. //中序
  23. void InOrder(node* root)
  24. {
  25. if (root != NULL)
  26. {
  27. InOrder(root->left);
  28. printf("%c", root->value);
  29. InOrder(root->right);
  30. }
  31. }

        

创建二叉树:

  • 方式
  •         先序遍历创建:根 ->左 ->右 的顺序

            中序遍历创建:左 -> 根 ->右的顺序

            后序遍历创建:左 -> 右-> 根的顺序

  • 首先对原始二叉树用 * 补为完全二叉树(包括叶子节点也要补上左右子树),如下右图所示:

 

  • 然后根、左、右(该处举例先序遍历方式创建)的顺序进行提取数据:A B D G * * H I * * * * C E * J * * F * *
  • 递归思想创建的思路演绎:
  •   步骤: 从跟开始赋值,然后依次是左孩子、右孩子的顺序。遇到 * 时,赋值为NULL,然后往上走。具体操作如下所示:

        原始数据:A B D G * * H I * * * * C E * J * * F * *

        第一次遇到 * :* * H I * * * * C E * J * * F * *,形成如下图所示的二叉树,将G的左右孩子赋值为NULL后,向上走,顺次该对D的右孩子赋值...

        第二次遇到*: * * * * C E * J * * F * *,形成如下图所示的二叉树,将I的左右孩子赋值为NULL后,向上走,顺次该对H的右孩子赋值为NULL,然后对B的右孩子赋值为NULL,紧接着将C赋值到A的右孩子位置...

        第三次遇到*: * J * * F * *,形成如下图所示的二叉树,将E的左孩子赋值为NULL后,将J赋值给右孩子位置...

        第四次遇到*: * * F * *,形成如下图所示的二叉树

        第五次遇到*: * *,形成如下图所示的二叉树

  • 代码:
  1. typedef struct node
  2. {
  3. char value;//当前节点值
  4. struct node* left;//指向当前节点左孩子指针
  5. struct node* right;//指向当前节点右孩子指针
  6. }Node;
  7. //根据先序遍历创建二叉树
  8. Node* Create(const char*& str) //因为要修改字符串就加了引用&
  9. {
  10. if (*str == '*')
  11. return NULL;
  12. else
  13. {
  14. Node* newnode = (Node*)malloc(sizeof(Node));
  15. if (newnode != NULL)
  16. {
  17. newnode->value = *str;
  18. newnode->left = Create(++str);
  19. newnode->right = Create(++str);
  20. return newnode;
  21. }
  22. }
  23. }
  • 完整代码:
  1. typedef struct node
  2. {
  3. char value;//当前节点值
  4. struct node* left;//指向当前节点左孩子指针
  5. struct node* right;//指向当前节点右孩子指针
  6. }Node;
  7. typedef struct tree
  8. {
  9. Node* root;
  10. }Tree;
  11. void InitTree(Tree* t)
  12. {
  13. t->root = NULL;
  14. }
  15. //先序遍历创建二叉树
  16. Node* Create(const char*& str) //因为要修改字符串就加了引用&
  17. {
  18. if (*str == '*')
  19. return NULL;
  20. else
  21. {
  22. Node* newnode = (Node*)malloc(sizeof(Node));
  23. if (newnode != NULL)
  24. {
  25. newnode->value = *str;
  26. newnode->left = Create(++str);
  27. newnode->right = Create(++str);
  28. return newnode;
  29. }
  30. }
  31. }
  32. //递归实现先序遍历输出二叉树
  33. void PreOrder(node* root)
  34. {
  35. if (root != NULL)
  36. {
  37. printf("%c", root->value);
  38. PreOrder(root->left);
  39. PreOrder(root->right);
  40. }
  41. }
  42. //递归实现后序遍历输出二叉树
  43. void PostOrder(node* root)
  44. {
  45. if (root != NULL)
  46. {
  47. PostOrder(root->left);
  48. PostOrder(root->right);
  49. printf("%c", root->value);
  50. }
  51. }
  52. //递归实现中序遍历输出二叉树
  53. void InOrder(node* root)
  54. {
  55. if (root != NULL)
  56. {
  57. InOrder(root->left);
  58. printf("%c", root->value);
  59. InOrder(root->right);
  60. }
  61. }
  62. int main()
  63. {
  64. Tree t;
  65. InitTree(&t);
  66. const char* str = "ABDG**HI****CE*J**F**";
  67. t.root = Create(str);
  68. printf("\n");
  69. printf("先序遍历二叉树:\n");
  70. PreOrder(t.root);
  71. printf("\n");
  72. printf("中序遍历二叉树:\n");
  73. InOrder(t.root);
  74. printf("\n");
  75. printf("后序遍历二叉树:\n");
  76. PostOrder(t.root);
  77. printf("\n");
  78. }
  • 运行结果:

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号