当前位置:   article > 正文

基于C语言二叉树的建立,先序,中序,后序遍历(包含完整代码)_编写二叉树的创建、二叉树的先序、中序和后序遍历算法的程序实现。

编写二叉树的创建、二叉树的先序、中序和后序遍历算法的程序实现。

首先加入两个头文件:#include <stdio.h>    

                                 #include <stdlib.h>

1.定义树中每个节点的结构体

  1.  typedef struct Tree
  2. {
  3.     int data;//数据域 
  4.     struct Tree *lchild;//左子树 
  5.     struct Tree *rchild;//右子树 
  6. }Tree;

2.新建节点(初始化一个节点)

  1. Tree *initTree(int data)
  2. {
  3. Tree *t = (Tree *)malloc(sizeof(Tree));//申请内存空间
  4. t->data = data;//写入元素
  5. t->lchild = NULL;//左右子树都为空
  6. t->rchild = NULL;
  7. return t;
  8. }

 3.查找

  1. int search(Tree *t,int data)
  2. {
  3. if(t==NULL)//判断是否为空,如果为空直接结束并返回-1
  4. return -1;
  5. else
  6. {
  7. if(t->data==data)
  8. {
  9. printf("查找成功!\n");
  10. return t->data;
  11. }
  12. search(t->lchild,data);//递归,向左子树查找
  13. search(t->rchild,data);//递归,向右子树查找
  14. }
  15. }

4.插入节点

  1. void insert(Tree **t,int data)//因为要修改节点中的值,这里使用双重解引用
  2. {/*双重解引用:通过两次解引用,找到指针指向的内存和内存中的数据*/
  3. if(*t==NULL)//如果传入的节点为空,直接新建一个节点,并把元素写入
  4. {
  5. *t = initTree(data);
  6. return;
  7. }
  8. if((*t)->data>data)//如果该节点内的元素大于data,向左子树找(小于向右子树找)
  9. insert(&(*t)->lchild,data);//传入解引用t的地址,才能修改值
  10. else
  11. insert(&(*t)->rchild,data);
  12. }

5.创建一个树

  1. Tree *create(int *data,int n)
  2. {
  3. int i;
  4. Tree *root = NULL;//定义根
  5. for(i=0;i<n;i++)//挨个插入元素到树中
  6. insert(&root,data[i]);
  7. return root;
  8. }

6.先序遍历(根左右)

  1. void preTree(Tree *root)
  2. {
  3. if(root==NULL)
  4. return ;
  5. printf("%d ",root->data);//输出根元素
  6. preTree(root->lchild);//递归,找左子树(进栈和出栈)
  7. preTree(root->rchild);//递归,找右子树(进栈和出栈)
  8. }

7.中序遍历(左根右)

  1. void inTree(Tree *root)
  2. {
  3. if(root==NULL)
  4. return;
  5. inTree(root->lchild);//不断递归,压栈,找最下层第一个左子树,然后回溯出栈
  6. printf("%d ",root->data);//按照左根右的顺序不断输出(出栈)
  7. inTree(root->rchild);//不断递归,压栈,出栈,找右子树输出
  8. }

8.后序遍历(左右根)

  1. void enTree(Tree *root)
  2. {
  3. if(root==NULL)
  4. return;
  5. enTree(root->lchild);//递归,左子树
  6. enTree(root->rchild);//递归,右子树
  7. printf("%d ",root->data);//边出栈,边输出
  8. }

9.主函数验证

  1. int main()
  2. {
  3. int num[10] = {5,3,8,2,4,1,6,7,9,0};
  4. Tree *root = create(num,10);//建立一颗树并把根赋值给root
  5. preTree(root);//验证先序遍历
  6. printf("\n");
  7. inTree(root);//验证中序遍历
  8. printf("\n");
  9. enTree(root);//验证后续遍历
  10. return 0;
  11. }

完整代码如下:

  1. /*排序二叉树,左小右大*/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. /*定义树的结构体*/
  5. typedef struct Tree
  6. {
  7. int data;//数据域
  8. struct Tree *lchild;//左子树
  9. struct Tree *rchild;//右子树
  10. }Tree;
  11. /*新建节点(初始化一个节点)*/
  12. Tree *initTree(int data)
  13. {
  14. Tree *t = (Tree *)malloc(sizeof(Tree));//申请内存空间
  15. t->data = data;//写入元素
  16. t->lchild = NULL;//左右子树都为空
  17. t->rchild = NULL;
  18. return t;
  19. }
  20. /*查找*/
  21. int search(Tree *t,int data)
  22. {
  23. if(t==NULL)//判断是否为空,如果为空直接结束并返回-1
  24. return -1;
  25. else
  26. {
  27. if(t->data==data)
  28. {
  29. printf("查找成功!\n");
  30. return t->data;
  31. }
  32. search(t->lchild,data);//递归,向左子树查找
  33. search(t->rchild,data);//递归,向右子树查找
  34. }
  35. }
  36. /*插入节点*/
  37. void insert(Tree **t,int data)//因为要修改节点中的值,这里使用双重解引用
  38. {/*双重解引用:通过两次解引用,找到指针指向的内存和内存中的数据*/
  39. if(*t==NULL)//如果传入的节点为空,直接新建一个节点,并把元素写入
  40. {
  41. *t = initTree(data);
  42. return;
  43. }
  44. if((*t)->data>data)//如果该节点内的元素大于data,向左子树找(小于向右子树找)
  45. insert(&(*t)->lchild,data);//传入解引用t的地址,才能修改值
  46. else
  47. insert(&(*t)->rchild,data);
  48. }
  49. /*创建一个树*/
  50. Tree *create(int *data,int n)
  51. {
  52. int i;
  53. Tree *root = NULL;//定义根
  54. for(i=0;i<n;i++)//挨个插入元素到树中
  55. insert(&root,data[i]);
  56. return root;
  57. }
  58. /*先序遍历(根左右)*/
  59. void preTree(Tree *root)
  60. {
  61. if(root==NULL)
  62. return ;
  63. printf("%d ",root->data);//输出根元素
  64. preTree(root->lchild);//递归,找左子树(进栈和出栈)
  65. preTree(root->rchild);//递归,找右子树(进栈和出栈)
  66. }
  67. /*中序遍历(左根右)*/
  68. void inTree(Tree *root)
  69. {
  70. if(root==NULL)
  71. return;
  72. inTree(root->lchild);//不断递归,压栈,找最下层第一个左子树,然后回溯出栈
  73. printf("%d ",root->data);//按照左根右的顺序不断输出(出栈)
  74. inTree(root->rchild);//不断递归,压栈,出栈,找右子树输出
  75. }
  76. /*后序遍历(左右根)*/
  77. void enTree(Tree *root)
  78. {
  79. if(root==NULL)
  80. return;
  81. enTree(root->lchild);//递归,左子树
  82. enTree(root->rchild);//递归,右子树
  83. printf("%d ",root->data);//边出栈,边输出
  84. }
  85. int main()
  86. {
  87. int num[10] = {5,3,8,2,4,1,6,7,9,0};
  88. Tree *root = create(num,10);//建立一颗树并把根赋值给root
  89. preTree(root);//验证先序遍历
  90. printf("\n");
  91. inTree(root);//验证中序遍历
  92. printf("\n");
  93. enTree(root);//验证后续遍历
  94. return 0;
  95. }

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

闽ICP备14008679号