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

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

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

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

一、树的定义:

树是 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.层序遍历:
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Python 入门实战:从零编写你的第一个网络爬虫
  • Spring Boot 集成 MyBatis-Plus 数据库操作与完整 CRUD 示例
  • 基于 FPGA 的 HDMA 驱动与 8B10B 编码实现
  • 线性回归算法原理及 Python 代码实现
  • Windows 10 系统禁用与关闭 Copilot 功能的多种方法
  • AI IDE 与 AI 辅助编程能否让程序员告别 996?
  • rrweb snapshot 深度解密:DOM 序列化与重建技术
  • Seedream 4.0 企业级图像生成能力与场景分析
  • Python 数据科学工具链入门:NumPy、Pandas、Matplotlib 快速上手
  • YOLOv10n-SOEP-PST 助老机器人目标检测与识别系统详解
  • 基于 SpringBoot+Vue 的日用品购物平台设计与实现
  • 开源 AI 绘画部署趋势:Qwen-2512+ComfyUI 实战分析
  • Spring Boot 2.0 整合 Spring Security OAuth2
  • OpenDroneMap 从无人机影像到三维地理模型教程
  • LIO-SAM 算法在 Ubuntu 22.04 与 ROS2 Humble 环境下的仿真部署实战
  • Stable Diffusion 1.5 皮革服装 LoRA 镜像部署指南
  • PID 算法原理、实现与应用实战
  • Spring Boot 项目使用 WebClient 调用第三方接口详细教程
  • Claude Code 安装与使用指南
  • Elasticsearch 核心概念、Kibana 测试与 C++ 客户端封装

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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