跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C算法

数据结构基础:树与二叉树定义及遍历算法

树的定义包含根节点与子树集合,二叉树分为满二叉树与完全二叉树等形态。核心内容包括四种遍历方式(前序、中序、后序、层序)的逻辑原理,以及基于 C 语言的结构体定义与递归算法实现,涉及创建、遍历及销毁二叉树的具体代码逻辑。

修罗发布于 2026/3/14更新于 2026/10/24104 浏览
数据结构基础:树与二叉树定义及遍历算法

一、树的定义:

树是 n(n>=0)个结点的有限集合。

当 n=0 时,称为空树。

当 n>0 时,满足:

  1. 有且仅有一个根节点(root)

  2. 其余节点可分为 m(m>=0)个互不相交的有限集合,每个集合本身也是一棵树,称为根的子树(Subtree)

概念:

  1. 节点的度---节点所拥有的子树的个数,如上图:b 的度为 2,a 的度为 3

  2. 树的度---节点中最大的度,如上图:树的度为 3

  3. 叶子(终端节点)---度为 0

  4. 分支节点(内部节点或非终端节点)---度不为 0

节点之间的关系:

  1. 双亲与孩子--节点的子树的根称为该节点的孩子,该节点称为孩子的双亲

  2. 祖先与子孙---祖先:从根到该节点所经分支上的所有节点,子孙:以某节点为根的子树中的任一节点

  3. 兄弟与堂兄弟---同一个双亲的节点互为兄弟,双亲在同一层的节点互为堂兄弟

二、二叉树

二叉树具有以下五种基本形态:

  1. 空二叉树

  2. 只有一个根节点

  3. 根节点只有左子树

  4. 根节点只有右子树

  5. 根节点既有左子树又有右子树

1.满二叉树:

每个分支节点都有左子树和右子树,叶子节点都在同一层且都是满的

文章配图

2.完全二叉树:

如果其每个节点的编号与满二叉树中编号从 1 到 n 的节点一一对应,可以不满

文章配图

重要性质:

文章配图

3.二叉树的遍历

a.前序遍历:

根 → 左 → 右

先访问根结点,再递归遍历左子树,最后右子树

文章配图

b.中序遍历:

左 → 根 → 右

简易方法:把这个二叉树展平,把字母放在一条线上,然后从左到右依次写出来就是 GDHBAEICF

注意:写算法的时候还是得知道它的原理是先递归遍历左子树,再访问根,最后右子树

文章配图

文章配图

c.后序遍历

左 → 右 → 根

先递归遍历左右子树,最后访问根结点

文章配图

d.层序遍历

从上到下、从左到右

按层次逐层访问,通常借助队列实现

文章配图

三、二叉树的算法实现

二叉树的结构体:

相关算法:

主要是利用递归实现

1.创建二叉树:

和操作数组差不多

char tree_seq[] = "ABDG##H###CE#I##F##"; int idx = 0; //索引 // 常见操作函数 btree_t * create_btree() // 创建二叉树 { //1.获取数据 char data = tree_seq[idx]; idx++; if (data == '#') { return NULL;//NULL 表示结束 } //2.创建新节点 malloc btree_t *new = malloc(sizeof(btree_t)); if (new == NULL) { printf("%s: malloc fail!\n",__func__); return NULL; } new->data = data;//tree_seq[idx]; //根 new->pl = create_btree(); //左 new->pr = create_btree(); //右 return new; }
2.前序遍历:

原理:根左右,递归即可

//函数 最终返回后,返回的是根节点 int pre_order_traverse(btree_t *t) //传根节点的地址 { //结束条件 t == NULL if (t == NULL) { return 0; } printf("%c ",t->data);//根 pre_order_traverse(t->pl); //左子树 //左 pre_order_traverse(t->pr);// 右子树 //右 return 0; }
3.中序遍历:

左根右

注意:递归函数名一定得和写的一致

int in_order_traverse(btree_t *t) // 中序遍历 { //结束条件 t == NULL if (t == NULL) { return 0; } in_order_traverse(t->pl); //左子树 //左 printf("%c ",t->data);//根 in_order_traverse(t->pr);// 右子树 //右 return 0; }
4.后序遍历:

左右根

int post_order_traverse(btree_t *t) // 后序遍历 { //结束条件 t == NULL if (t == NULL) { return 0; } post_order_traverse(t->pl); //左子树 //左 post_order_traverse(t->pr);// 右子树 //右 printf("%c ",t->data);//根 return 0; } 
5.销毁二叉树:

后续遍历,然后销毁

int btree_destroy(btree_t *t) // 销毁二叉树 { if (t == NULL) { return -1; } //递归 --- 后序方式 //左右根 btree_destroy(t->pl);//左 btree_destroy(t->pr);//右边 free(t); return 0; }
6.层序遍历:

需要用到链式队列,把队列那那一篇的结构体和函数拿来用

注意:队列结构体的数据域是二叉树的结构体地址

即: typedef struct btree data_t;//队列处理的数据类型是地址*

难点在于这个循环能否理解,只要队列不为空就持续循环:拿节点出队打印

文章配图

 int layer_order_traverse(btree_t *t) { if(t == NULL) { return -1; } //创建队列 qnode_t *pque = create_queue(); //拿节点,入队 enqueue(pque,t); while(pque->next !=NULL)//一直循环,直到队列没有数据 { //出队打印 btree_t *p = dequeue(pque); printf("%c",p->data); //如果有左右孩子,就入队 if(p->pl != NULL) { enqueue(pque,p->pl); } if(p->pr != NULL) { enqueue(pque,p->pr); } } putchar('\n'); queue_destroy(&pque);//销毁队列 return 0; }

目录

  1. 一、树的定义:
  2. 概念:
  3. 节点之间的关系:
  4. 二、二叉树
  5. 1.满二叉树:
  6. 2.完全二叉树:
  7. 重要性质:
  8. 3.二叉树的遍历
  9. a.前序遍历:
  10. b.中序遍历:
  11. c.后序遍历
  12. d.层序遍历
  13. 三、二叉树的算法实现
  14. 二叉树的结构体:
  15. 相关算法:
  16. 1.创建二叉树:
  17. 2.前序遍历:
  18. 3.中序遍历:
  19. 4.后序遍历:
  20. 5.销毁二叉树:
  21. 6.层序遍历:

更多推荐文章

查看全部
  • Java 并发编程:ForkJoin 分而治之框架
  • WebMCP:Chrome 新 API 特性与 Agentic Web 前瞻
  • 科学机器学习中的物理信息神经网络:现状与展望
  • Python 数据分析基础:NumPy 数组创建与操作详解
  • SpringBoot 配置文件核心用法:Properties 与 YAML
  • Codex 与 Copilot:AI 编程助手技术解析
  • Python 开源 AI 模型引入与测试全流程实战
  • 黑客、骇客、白客与红客的定义及工作区别解析
  • Linux 下 C++ 线程池实现与并发安全详解
  • Whisper-Tiny + Go 语音转写服务部署指南 (Ubuntu 20.04)
  • 基于 Spring Boot 的书法比赛评分系统设计与实现
  • wkhtmltopdf 跨平台安装配置指南:Linux/Windows/macOS
  • 低代码平台中Python插件的关键应用场景
  • Spring Cloud Config 与 Apollo 配置中心架构深度对比
  • WindowsCleaner v5.0:基于 Tkinter 的 Python 系统优化工具
  • 基于 LangGraph 的 Python 记忆机器人:支持搜索工具与人工干预
  • Android 面试核心知识点与真题解析指南
  • 6 年自研纯 C# UI 引擎 XchyUI,内核小于 200KB 支持跨平台
  • 基于微信小程序的菜谱查询点评系统设计与开发
  • VS Code 远程环境 GitHub Copilot 报错排查与修复方案

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online