数据结构---二叉树(C语言)

简介: 数据结构---二叉树(C语言)

二叉树

1. 二叉树

  1. 空树
  2. 非空:根节点,根节点的左子树、根节点的右子树组成的。

1.1 二叉树的遍历

从二叉树的定义来看,二叉树是递归定义的,因此我们可以用递归的形式来遍历二叉树。

1.1.1二叉树前中后序遍历(递归版)

访问根结点的顺序不同。

//先序遍历
void PreOrder(BTNode* root)
{
  if (root == NULL)
  {
    printf("* ");
    return;
  }
  printf("%d ", root->data);
  PreOrder(root->left);
  PreOrder(root->right);
}
//中序遍历
void InOrder(BTNode* root)
{
  if (root == NULL)
  {
    printf("* ");
    return;
  }
  PreOrder(root->left);
  printf("%d ", root->data);
  PreOrder(root->right);
}
//后序遍历
void PostOrder(BTNode* root)
{
  if (root == NULL)
  {
    printf("* ");
    return;
  }
  PreOrder(root->left);
  PreOrder(root->right);
  printf("%d ", root->data);
}

1.1.2 层序遍历

层序遍历是按照二叉树的高度,一层一层遍历,需要借助队列来完成。但是C语言没有这样的数据结构,需要我们自己来提前写一个。(本例子不提供队列的实现)

//层序遍历
void LevelOrder(BTNode* root)
{
  Queue q;
  QueueInit(&q);
  //根节点入队
  if (root)
  {
    QueuePush(&q, root);
  }
  while (!QueueEmpty(&q))
  {
    //先获取队首元素,再出队,左右孩子不为空,入队
    BTNode* front = QueueFront(&q);
    QueuePop(&q);
    if (front->left)
    {
      QueuePush(&q, front->left);
    }
    if (front->right)
    {
      QueuePush(&q, front->right);
    }
    printf("%d ", front->data);
  }
  QueueDestroy(&q);
}

1.2 二叉树的其他相关接口

1.2.1 求二叉树的结点数量

//求二叉树的结点数量
int NodeSize(BTNode* root)
{
  if (root == NULL)
    return 0;
  return 1+NodeSize(root->left)+NodeSize(root->right);
}

1.2.2 求叶子结点个数

//求叶子结点个数
int LeafSize(BTNode* root)
{
  //防止空树
  if (root == NULL)
    return 0;
  //是叶子
  if (root->left == NULL && root->right == NULL)
    return 1;
  //不是叶子
  return  LeafSize(root->left)+LeafSize(root->right);
}

1.2.3 求树高

//求树高
int TreeDepth(BTNode* root)
{
  //避免空树
  if (root == NULL)
    return 0;
  int depth_left = 1 + TreeDepth(root->left);
  int depth_right = 1 + TreeDepth(root->right);
  return depth_left > depth_right ? depth_left : depth_right;
}

1.2.4 求第k层结点个数

//求第k层结点个数
int BinaryTreeLevelKSize(BTNode* root,int k)
{
  //空树
  if (root == NULL)
    return 0;
  if (k == 1)
    return 1; 
  int count = BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
  return count;
}

1.2.5 查找二叉树值为k的结点

//查找二叉树值为x的结点
BTNode* BinaryTreeFind(BTNode* root, int x)
{
  //防止二叉树为空
  if (root == NULL)
    return NULL;
  if (root->data == x)
    return root;
  BTNode* ret1 = BinaryTreeFind(root->left, x);
  if (ret1 != NULL)
    return ret1;
  BTNode* ret2 = BinaryTreeFind(root->right, x);
  if (ret2 != NULL)
    return ret2;
  return NULL;
}

文章知识点与官方知识档案匹配,可进一步学习相关知识

目录
相关文章
|
2月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
49 1
|
2月前
|
存储 算法 搜索推荐
【趣学C语言和数据结构100例】91-95
本文涵盖多个经典算法问题的C语言实现,包括堆排序、归并排序、从长整型变量中提取偶数位数、工人信息排序及无向图是否为树的判断。通过这些问题,读者可以深入了解排序算法、数据处理方法和图论基础知识,提升编程能力和算法理解。
56 4
|
2月前
|
存储 机器学习/深度学习 搜索推荐
【趣学C语言和数据结构100例】86-90
本文介绍并用C语言实现了五种经典排序算法:直接插入排序、折半插入排序、冒泡排序、快速排序和简单选择排序。每种算法都有其特点和适用场景,如直接插入排序适合小规模或基本有序的数据,快速排序则适用于大规模数据集,具有较高的效率。通过学习这些算法,读者可以加深对数据结构和算法设计的理解,提升解决实际问题的能力。
48 4
|
2月前
|
存储 算法 数据处理
【趣学C语言和数据结构100例】81-85
本文介绍了五个经典算法问题及其C语言实现,涵盖图论与树结构的基础知识。包括使用BFS求解单源最短路径、统计有向图中入度或出度为0的点数、统计无向无权图各顶点的度、折半查找及二叉排序树的查找。这些算法不仅理论意义重大,且在实际应用中极为广泛,有助于提升编程能力和数据结构理解。
53 4
|
2月前
|
算法 数据可视化 数据建模
【趣学C语言和数据结构100例】76-80
本文介绍了五种图论算法的C语言实现,涵盖二叉树的层次遍历及广度优先搜索(BFS)和深度优先搜索(DFS)的邻接表与邻接矩阵实现。层次遍历使用队列按层访问二叉树节点;BFS利用队列从源节点逐层遍历图节点,适用于最短路径等问题;DFS通过递归或栈深入图的分支,适合拓扑排序等场景。这些算法是数据结构和算法学习的基础,对提升编程能力和解决实际问题至关重要。
54 4
|
2月前
|
存储 算法 vr&ar
【趣学C语言和数据结构100例】71-75
本文介绍了五个C语言数据结构问题及其实现,涵盖链表与二叉树操作,包括按奇偶分解链表、交换二叉树左右子树、查找节点的双亲节点、计算二叉树深度及求最大关键值。通过递归和遍历等方法,解决了理论与实际应用中的常见问题,有助于提升编程能力和数据结构理解。
45 4
|
2月前
|
存储 算法 C语言
【趣学C语言和数据结构100例】66-70
本书《趣学C语言和数据结构100例》精选了5个典型的数据结构问题及C语言实现,涵盖链表与数组操作,如有序集合的集合运算、有序序列表的合并、数组中两顺序表位置互换、三递增序列公共元素查找及奇偶数重排。通过详细解析与代码示例,帮助读者深入理解数据结构与算法设计的核心思想,提升编程技能。
37 4
|
2月前
|
存储 算法 C语言
【趣学C语言和数据结构100例】51-55
本文介绍了五个关于链表操作的C语言实现案例,包括删除单链表中的重复元素、从两个有序链表中查找公共元素、判断一个链表是否为另一链表的连续子序列、判断循环双链表是否对称及合并两个循环单链表。每个案例都详细解析了算法思路与实现方法,涵盖了链表操作的多种场景,旨在帮助读者深入理解链表数据结构的应用,提升算法设计与编程能力。
44 4
|
2月前
|
存储 算法 C语言
【趣学C语言和数据结构100例】16-20
本文精选了五个C语言编程问题,涵盖数组操作、字符串处理等基础领域。包括查找二维数组中的鞍点、折半查找法、统计文章中字符数量、电文解密及字符串连接。每个问题都附有详细的代码实现与分析,旨在帮助读者理解算法逻辑,提升编程技巧。通过这些实践,不仅能锻炼编程能力,还能加深对数据结构和算法的理解,为未来的学习和工作打下坚实基础。
68 4
|
8天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充