追梦之旅【数据结构篇】——详解C语言实现二叉树

简介: 详解C语言实现二叉树~😎前言🙌什么是二叉树?二叉树的性质总结:整体实现内容分析💞1.头文件的编写:🙌2.功能文件的编写:🙌1)前序遍历的数值来创建树——递归函数实现 😊2)求树的高度函数实现 😊3)求叶子数函数实现 😊4)求树的总结点个数函数实现 😊5)前序遍历二叉树实现 😊6)中序遍历二叉树实现 😊7)后序遍历二叉树实现 😊8)删除二叉树函数实现 😊3.测试文件编写::🙌总结撒花💞

微信图片_20230427214238.gif

😎博客昵称:博客小梦

😊最喜欢的座右铭:全神贯注的上吧!!!

😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!

😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘


微信图片_20230427160707.gif


前言🙌



   哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,手把手带领大家详解C语言实现二叉树~ 利用二叉链式存储结构来完成二叉树的实现,并完成叶子高度,前序遍历生成树,叶节点的个数,结点总数,前序遍历,中序遍历,后序遍历,销毁树。都是精华内容,可不要错过哟!!!😍😍😍


什么是二叉树?


满足以下两个条件的树就是二叉树:


1.本身是有序树;

2.树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;


二叉树的性质总结:


1.二叉树中,第 i 层最多有 2^( i-1)个结点。

2.如果二叉树的深度为 K,那么此二叉树最多有 2^K-1 个结点。

3.二叉树中,终端结点数(叶子结点数)为 n0,度为 2 的结点数为 n2,则 n0=n2+1。


二叉树又可以分类为许多不同的二叉树:

微信图片_20230428141935.png


整体实现内容分析💞


  • 1.利用二叉链式存储结构来完成二叉树的实现,并完成叶子高度,前序遍历生成树,叶节点的个数,结点总数,前序遍历,中序遍历,后序遍历,销毁树。
  • 2.采用递归的思想,先是malloc开辟结点空间,然后给结点赋值,然后递归左子树然后递归右子树。这里用*表示空。最后返回生成的root指针的地址求高度,采用后序遍历的思想。
  • 3.相当于求左右子树结点高度的最大值。每次递归加1就是计算结点数。求叶子总数时先求出左子树的叶子数再加上右子树的叶子数。求总结点数时这里直接递归计算出左子树和右子树的总结点数,每次加1表示遍历的节点数计算。然后就是前中后序的实现,这里也是用到递归的思想,最后便是将数销毁掉,malloc生成的空间要用free手动销毁。


1.头文件的编写:🙌


头文件的编写的整体思路分析:

这里用的是二叉链式存储的实现。首先是定义结构体,然后是对求叶子高度,前序遍历生成树,叶节点的个数,结点总数,前序遍历,中序遍历,后序遍历,销毁树。

#pragma once
#include"stdio.h"
#include"stdlib.h"
typedef int datatype;
typedef struct node
{
  datatype data;
  struct node* lchild, * rchild;
}tree;
tree* Creatbitree();
int Depthbitree(tree* T);
int Leaf_count(tree* T);
int Countbitree(tree* T);
int Preorder(tree* T);
int Inorder(tree* T);
int Postorder(tree* T);
tree* Delete(tree* T);


2.功能文件的编写:🙌


1)前序遍历的数值来创建树——递归函数实现 😊


编写的整体思路分析:

采用递归的思想,先是malloc开辟结点空间,然后给结点赋值,然后递归左子树然后递归右子树。这里用*表示空。最后返回生成的root指针的地址

#include"BinaryTree.h"
tree* Creatbitree()//前序遍历的数值来创建树——递归 
{
  char ch;
  tree* root;
  scanf("%c", &ch);//用于接收输入的数值 
  if (ch == '*') return NULL;//用*来判断是否为空 
  else {
    root = (tree*)malloc(sizeof(tree));
    root->data = ch;//赋值 
    root->lchild = Creatbitree();//左子树 
    root->rchild = Creatbitree();//右子树 
  }
  return root;
}


2)求树的高度函数实现 😊


编写的整体思路分析:

这里求高度,采用后序遍历的思想。相当于求左右子树结点高度的最大值。每次递归加1 就是计算结点数。

int Depthbitree(tree* T)//测量树的深度 
{
  if (T == NULL) return 0;
  else {
    int leftheighter = Depthbitree(T->lchild);
    int rightheighter = Depthbitree(T->rchild);
    return (leftheighter > rightheighter ? leftheighter + 1 : rightheighter + 1);
  }
}


3)求叶子数函数实现 😊


编写的整体思路分析:

代码上已表明算法思想,先求出左子树的叶子数再加上右子树的叶子数。

int Leaf_count(tree* T)//测量叶子的数量 
{
  if (T == NULL) return 0;
  else if (!T->lchild && !T->rchild)//如果左右结点都为空则他就是叶子结点 
    return 1;
  else return Leaf_count(T->lchild) + Leaf_count(T->rchild);
}


4)求树的总结点个数函数实现 😊


编写的整体思路分析:

这里直接递归计算出左子树和右子树的总结点数,每次加1表示遍历的节点数计算。

int Countbitree(tree* T) //测量总的结点个数
{
  if (T == NULL)
    return 0;
  else {
    return  Countbitree(T->lchild) + Countbitree(T->rchild)+1;
  }
}


5)前序遍历二叉树实现 😊


int Preorder(tree* T)//前序遍历序列 (根左右) 
{
  if (T == NULL)
    return 0;
  else {
    printf("%c  ", T->data);//先输出根节点 
    Preorder(T->lchild);
    Preorder(T->rchild);
  }
}


6)中序遍历二叉树实现 😊


int Inorder(tree* T)//中序遍历序列 (左根右) 
{
  if (T == NULL)
    return 0;
  else {
    Inorder(T->lchild);//先输出左孩子 
    printf("%c  ", T->data);
    Inorder(T->rchild);
  }
}


7)后序遍历二叉树实现 😊


int Postorder(tree* T)//后序遍历序列 (左右根) 
{
  if (T == NULL)
    return 0;
  else {
    Postorder(T->lchild);//先输出左孩子 
    Postorder(T->rchild);
    printf("%c  ", T->data);
  }
}


8)删除二叉树函数实现 😊


tree* Delete(tree* T)//删除树 
{
  if (T->lchild)
    Delete(T->lchild);
  else if (T->rchild)
    Delete(T->rchild);
  else
    free(T);
}


3.测试文件编写::🙌


#define _CRT_SECURE_NO_WARNINGS 1
#include"BinaryTree.h"
main()
{
  tree* T;
  T = (tree*)malloc(sizeof(tree));
  T->lchild = NULL;
  T->rchild = NULL;
  printf("请输入树的前序遍历序列\n");
  T = Creatbitree();
  int n = Depthbitree(T);
  int m = Leaf_count(T);
  int l = Countbitree(T);
  printf("树创建完成\n");
  printf("前序输出为\n");
  printf("\t\t");
  Preorder(T);
  printf("\n中序输出为\n");
  printf("\t\t");
  Inorder(T);
  printf("\n后序输出为\n");
  printf("\t\t");
  Postorder(T);
  printf("\n高度%d\n叶子%d\n总结点%d\n", n, m, l);
  Delete(T);
  printf("删除成功");
}


功能测试结果展示图:

微信图片_20230428142819.png


总结撒花💞


本篇文章旨在分享详解C语言实现二叉树。希望大家通过阅读此文有所收获!本次主要是对二叉树的实现,这里只要用到的思想是递归,这也是难点所在。这就要需要画图帮忙辅助理解,递归的具体每一步是如何执行的需要分析清楚。在创建树的时候可以采用前序遍历思想创建,这种思想创建是比较好理解的,也可以用其他思想创建,相对比较难理解一点。以及区分好前中后序遍历的思想,然后再编写代码。

  😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘


相关文章
|
2月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
68 1
|
2月前
|
存储 算法 搜索推荐
【趣学C语言和数据结构100例】91-95
本文涵盖多个经典算法问题的C语言实现,包括堆排序、归并排序、从长整型变量中提取偶数位数、工人信息排序及无向图是否为树的判断。通过这些问题,读者可以深入了解排序算法、数据处理方法和图论基础知识,提升编程能力和算法理解。
69 4
|
2月前
|
存储 机器学习/深度学习 搜索推荐
【趣学C语言和数据结构100例】86-90
本文介绍并用C语言实现了五种经典排序算法:直接插入排序、折半插入排序、冒泡排序、快速排序和简单选择排序。每种算法都有其特点和适用场景,如直接插入排序适合小规模或基本有序的数据,快速排序则适用于大规模数据集,具有较高的效率。通过学习这些算法,读者可以加深对数据结构和算法设计的理解,提升解决实际问题的能力。
56 4
|
2月前
|
存储 算法 数据处理
【趣学C语言和数据结构100例】81-85
本文介绍了五个经典算法问题及其C语言实现,涵盖图论与树结构的基础知识。包括使用BFS求解单源最短路径、统计有向图中入度或出度为0的点数、统计无向无权图各顶点的度、折半查找及二叉排序树的查找。这些算法不仅理论意义重大,且在实际应用中极为广泛,有助于提升编程能力和数据结构理解。
57 4
|
2月前
|
算法 数据可视化 数据建模
【趣学C语言和数据结构100例】76-80
本文介绍了五种图论算法的C语言实现,涵盖二叉树的层次遍历及广度优先搜索(BFS)和深度优先搜索(DFS)的邻接表与邻接矩阵实现。层次遍历使用队列按层访问二叉树节点;BFS利用队列从源节点逐层遍历图节点,适用于最短路径等问题;DFS通过递归或栈深入图的分支,适合拓扑排序等场景。这些算法是数据结构和算法学习的基础,对提升编程能力和解决实际问题至关重要。
62 4
|
2月前
|
存储 算法 vr&ar
【趣学C语言和数据结构100例】71-75
本文介绍了五个C语言数据结构问题及其实现,涵盖链表与二叉树操作,包括按奇偶分解链表、交换二叉树左右子树、查找节点的双亲节点、计算二叉树深度及求最大关键值。通过递归和遍历等方法,解决了理论与实际应用中的常见问题,有助于提升编程能力和数据结构理解。
51 4
|
13天前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
37 12
|
13天前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
37 10
|
13天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
37 2
|
27天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充