二叉树的链式结构 - C语言(含有大量递归)上

简介: 二叉树的链式结构 - C语言(含有大量递归)

🍔前言


       🥰我们学习完二叉树的“堆”以及堆的应用以后还有一个在平时面试题目中出现频率也非常高的结构等着我们呢,那就是—二叉树的链式结构(二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系)链式结构又分为二叉链和三叉链,当前我们使用的都是二叉链,后面的博客(红黑树等会用到三叉链)各位客官老爷,关注一下后续会更新呦!!!🥰🥰


🍔二叉树链式结构的实现


🍟基本构架


🥝在看二叉树基本操作前,再回顾下二叉树的概念


🔴二叉树是:


⭕ 空树

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


d64f37704da8fa47d54d56261944b352_59e5c7ffb04a6c96e6fffd5cc997930b.jpeg


✅从概念中可以看出,二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的。


😍代码:


typedef int BTDataType;  //记录树内数据类型,方便后面修改
typedef struct BinaryTreeNode
{
  BTDataType data;  //记录节点
  struct BinaryTreeNode* left; //指针指向左子树
  struct BinaryTreeNode* right;//指针指向右子树
}BTNode;  //结构体的名字

     💧运用上面的这些代码,可以记录一颗二叉树的所有节点,所有推论也从这个地方出来了。后面也会有很多的结构跟这个有关。


🍔二叉树的遍历


    🍪学习二叉树结构,最简单的方式就是遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。


🍟前序遍历


   🚩前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。(根——左子树——右子树)


https://ucc.alicdn.com/images/user-upload-01/202012091634524.gif#pic_center


// 二叉树前序遍历 
void BinaryTreePrevOrder(BTNode* root)
{
  if (root == NULL)
  {
  printf("N ");
  return;
  }
  printf("%d ", root->data);
  BinaryTreePrevOrder(root->left);
  BinaryTreePrevOrder(root->right);
}


🍟中序遍历


        🚩中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。(左子树——根——右子树)


9882877d34e6ee36f829bcd54e11a4af_20200429123443327.gif


// 二叉树中序遍历
void BinaryTreeInOrder(BTNode* root) 
{
  if (root == NULL)
  {
  printf("N ");
  return;
  }
  BinaryTreeInOrder(root->left);
  printf("%d ", root->data);
  BinaryTreeInOrder(root->right);
}


🍟后序遍历


      🚩 后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。(左子树——右子树——根)


62be23194e381501a070bcb99a2b7f1b_20200429123504470.gif


// 二叉树后序遍历
void BinaryTreePostOrder(BTNode* root)
{
  if (root == NULL)
  {
  printf("N ");
  return;
  }
  BinaryTreePostOrder(root->left);
  BinaryTreePostOrder(root->right);
  printf("%d ", root->data);
}


🍟层序遍历


      🚩 层序遍历:除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。


82b6920744d5cdf7cae36aab3490ff65_a3fe933d98674d9caa1cc62e603177e5.png


🔴层序遍历的思路及代码


       ⭕层序遍历需要用到队列的一些知大家可以先去了解一下队列的特点队列的概念及结构(内有成型代码可供CV工程师参考)_硕硕C语言的博客-CSDN博客如下图:


5013c9c03080905289fada751b748f43_96f61ea6ccfd64a29d6b2810696971ca.gif


     🚨需要注意的是进入队列的不是节点的值,而是节点的地址,这样做可以方便的把后面的左右子树的节点带出来,也方便了后面的判断。


// 层序遍历
void BinaryTreeLevelOrder(BTNode* root)
{
  Queue q;  //建立队列
  QueueInit(&q); //初始化队列
  if (root)  //插入数据
  {
  QueuePush(&q, root);//入队列
  }
  while (!QueueEmpty(&q)) //不为空队列证明后面还有数据没有出来
  {
  BTNode* front = QueueFront(&q); //记录队头的值
  QueuePop(&q); //出队列
  printf("%d ", front->data);
  if (front->left)
    QueuePush(&q, front->left); //遍历左子树
  if (front->right)
    QueuePush(&q, front->right);//遍历右子树
  }
  printf("\n");
  QueueDestroy(&q);//队列的销毁
}


       🥰 这个思想后面的判断二叉树是否是完全二叉树也要用到


目录
相关文章
|
2月前
|
网络协议 编译器 Linux
【C语言】结构体内存对齐:热门面试话题
【C语言】结构体内存对齐:热门面试话题
108 0
|
1月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
87 16
|
1月前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
132 8
|
2月前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
75 7
|
2月前
|
C语言
c语言回顾-函数递归(上)
c语言回顾-函数递归(上)
46 2
|
2月前
|
C语言
链式顺序表实现(C语言描述)
本文介绍了如何在C语言中实现链式顺序表,包括数据结构的定义、节点的创建、数据的插入和删除以及链表的打印和销毁。
49 2
|
2月前
|
编译器 C语言 Python
C语言结构
C语言结构
21 0
|
2月前
|
C语言
c语言回顾-函数递归(下)
c语言回顾-函数递归(下)
44 0
|
3月前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
3月前
|
存储 算法 C语言
C语言手撕实战代码_二叉树_构造二叉树_层序遍历二叉树_二叉树深度的超详细代码实现
这段代码和文本介绍了一系列二叉树相关的问题及其解决方案。其中包括根据前序和中序序列构建二叉树、通过层次遍历序列和中序序列创建二叉树、计算二叉树节点数量、叶子节点数量、度为1的节点数量、二叉树高度、特定节点子树深度、判断两棵树是否相似、将叶子节点链接成双向链表、计算算术表达式的值、判断是否为完全二叉树以及求二叉树的最大宽度等。每道题目均提供了详细的算法思路及相应的C/C++代码实现,帮助读者理解和掌握二叉树的基本操作与应用。