当前位置:   article > 正文

C语言实现二叉树(纯新手向)_c语言建立二叉树

c语言建立二叉树

目录

一、二叉树的基本概念

二、二叉树的初始化

三、释放二叉树

四、前中后序遍历二叉树

五、主函数和效果截图

六、拓展时间


这是我这段时间学习c语言二叉树的成果,希望对大家有所帮助,共同进步!

一、二叉树的基本概念

二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树定义结构体可以这样设计

代码如下

  1. //定义二叉树的结构
  2. typedef struct binary_tree
  3. {
  4.     int data;   // 节点保存的数据
  5.     binary_tree* left; // 定义左节点指针
  6.     binary_tree* right; // 定义右节点指针
  7. }node;

二、二叉树的初始化

malloc分配内存,然后初始化节点左右指针域为空,以及数据域为gain,最后*tree=temp把节点安装到树上并且返回上一级;对于已经存在的树节点,我们需要往左右两分子扩展;当gain小于上一级的data,那就创建左子树并把值赋给该节点,当gain大于上一级的data,那就创建右子树并把值赋给该节点。

代码如下:

  1. //初始化二叉树
  2. void insert(node** tree, int gain) //指向指针变量的指针,结果是指针tree所指向的值
  3. {
  4.     node* temp = NULL;
  5.     if (!(*tree)) //判断根节点是否存在
  6.     {
  7.         temp = (node*)malloc(sizeof(node));
  8.         temp->left = temp->right = NULL; //左右节点制空
  9.         temp->data = gain;
  10.         *tree = temp;
  11.         return;
  12.     }
  13.     if (gain < (*tree)->data) //判断是左子树
  14.     {
  15.         insert(&(*tree)->left, gain); //等价于 &((*tree)->left),创建左子树
  16.     }
  17.     else if (gain > (*tree)->data) //判断是右子树
  18.     {
  19.         insert(&(*tree)->right, gain);//等价于 &((*tree)->right),创建右子树
  20.     }
  21. }

三、释放二叉树

节点创建好了,注意用malloc创建;因此,在堆中分配的内存需要手动释放需要用到free函数与之对应;

  1. //释放节点内存
  2. void deltree(node* tree)
  3. {
  4.     if (tree)
  5.     {
  6.         deltree(tree->left);//先往左子树一直寻找
  7.         deltree(tree->right);//再往右子树一直寻找
  8.         free(tree); //找不到了free返回上一级
  9.     }
  10. }

四、前中后序遍历二叉树

递归方式实现前序遍历,先访问根节点,再前序遍历左子树,最后前序遍历右子树

递归方式实现中序遍历,先中序遍历左子树,再访问根节点,最后中序遍历右子树

递归方式实现后序遍历,先后序遍历左子树,再后序遍历右子树,最后访问根节点

代码如下:

  1. //前序遍历
  2. void leader(node* tree)
  3. {
  4.     if (tree)
  5.     {
  6.         printf("%d\n", tree->data);
  7.         leader(tree->left);
  8.         leader(tree->right);
  9.     }
  10. }
  11. //中序遍历
  12. void inorder(node* tree)
  13. {
  14.     if (tree) {
  15.         inorder(tree->left);
  16.         printf("%d\n", tree->data);
  17.         inorder(tree->right);
  18.     }
  19. }
  20. //后序遍历
  21. void lastder(node* tree)
  22.  {
  23.     if (tree) {
  24.         lastder(tree->left);
  25.         lastder(tree->right);
  26.         printf("%d\n", tree->data);
  27.     }
  28. }

五、主函数和效果截图

主函数里面给二叉树赋值,顺序为ABCDEFG。

那么前序输出ABDECFG

中序输出DBEAFCG

后续输出DEBFGCA

代码如下:

  1. int main(void)
  2. {
  3.     node* root;
  4.     //int i;
  5.     root = NULL;
  6.     //将值赋给二叉树,下面是满二叉树形式
  7.     insert(&root, 9);
  8.     insert(&root, 4);
  9.     insert(&root, 15);
  10.     insert(&root, 6);
  11.     insert(&root, 12);
  12.     insert(&root, 16);
  13.     insert(&root, 2);
  14.     printf("前序遍历\n");
  15.     leader(root);
  16.     printf("中序遍历\n");
  17.     inorder(root);
  18.     printf("后序遍历\n");
  19.     lastder(root);
  20.     //释放掉二叉树
  21.     deltree(root);
  22. }

效果截图

验证结果无误!

六、拓展时间

在进行遍历过程中,对遍历的顺序产生了疑问,程序采用了递归方式进行遍历,但是怎么进行遍历这个过程不是很清楚,那么将程序展开。

  1. //先序遍历
  2. void leader(node* tree)
  3. {
  4.     if (tree)
  5.     {
  6.         printf("根节点 %d\n", tree->data);
  7.         if (tree->left)
  8.         {
  9.             printf("%d 作为 %d 的左子树\n", tree->left->data,tree->data);
  10.             leader(tree->left);
  11.         }
  12.         if(tree->right)
  13.         {
  14.             printf("%d 作为 %d 的右子树\n", tree->right->data,tree->data);
  15.             leader(tree->right);
  16.         }
  17.     }//如果tree为空则没有递归操作
  18. }

在这里我将根节点和叶子节点结合起来,打印输出观察结果。

可以观察到,在进行递归的过程中,下一个叶子节点又作为根节点进行遍历,直到没有叶子节点为止,而遍历的顺序就是为根节点的顺序。

源码链接在这:c语言实现二叉树(源码)_徐徐而闻的博客-CSDN博客

最后,希望大家动动手指,点赞收藏起来,这是对新人的最好支持!谢谢大家!!

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

闽ICP备14008679号