当前位置: 首页 > news >正文

Linux学习-数据结构(二叉树)

1.概念

  • 线性结构:描述数据一对一(表)的关系
  • 非线性结构:描述数据一对多(树),多对多(图)的关系

2.树形结构

  • 节点:树形结构中组成树形结构的一个小的单元称为节点
  • 前驱(祖先):由哪个节点可以访问到该节点
  • 后继(子孙):该节点可以后续访问到哪些节点
  • 层:根节点层数为1,后续每引申出来一个节点,层数+1
  • 树的层数:由层数最高的节点对应的层数表示树的层数
  • 高度:节点高度是由该节点到最远的叶子节点的距离表示该节点高度
  • 深度:节点深度由该节点到根节点的距离表示节点深度
  • 树的高度 == 树的深度 == 树的层数
  • 度:后继节点的个数

节点:

  • 根节点:只有后继没有前驱
  • 分支节点:既有前驱也有后继
  • 叶子节点:只有前驱没有后继

3.二叉树

1.概念

树型结构中的所有节点度数最大为2,称为二叉树

2.二叉树节点状态

  • 叶子节点:度数为0
  • 只有左孩子
  • 只有右孩子
  • 左右孩子都有

3.满二叉树

所以的叶子节点均在同一层,且每层节点个数均为最大值


特性:

  • 满二叉树第k层节点有2^{k-1}
  • 满二叉树前k层节点有2^{k}-1

4.完全二叉树

二叉树的编号(如果节点编号为n,左孩子编号为2n,右孩子编号为2n+1)展开是连续的,称为完全二叉树


二叉树的遍历形式

  • 深度优先遍历(DFS)
  • 广度优先遍历(BFS)

深度优先遍历(DFS)

  • 前序遍历:根左右

  • 中序遍历:左根右

  • 后序遍历:左右根

广度优先遍历(层序遍历)

4.完全二叉树的操作

1.定义

typedef struct node{int no;struct node *pleftchild;struct node *prightchild;
}treenode;

2.使用形式(递归)

treenode *creat_treechild(int startno, int endno)
{treenode *ptmpnode = NULL;ptmpnode = malloc(sizeof(treenode));if(ptmpnode == NULL){perror("fail to malloc");return NULL;} ptmpnode->no = startno;ptmpnode->pleftchild = ptmpnode->prightchild = NULL;if(2*startno <= endno){ptmpnode->pleftchild = creat_treechild(2*startno, endno);}if(2*startno+1 <= endno){ptmpnode->prightchild = creat_treechild(2*startno+1, endno);}    return ptmpnode;
}/*前序遍历*/
int preorder_treechild(treenode *proot)
{printf("%d ",proot->no);if(proot->pleftchild != NULL){preorder_treechild(proot->pleftchild);}if(proot->prightchild != NULL){preorder_treechild(proot->prightchild);}return 0;
}/*中序遍历*/
int midorder_treechild(treenode *proot)
{if(proot->pleftchild != NULL){preorder_treechild(proot->pleftchild);}printf("%d ",proot->no);if(proot->prightchild != NULL){preorder_treechild(proot->prightchild);}return 0;
}/*后续遍历*/
int posorder_treechild(treenode *proot)
{if(proot->pleftchild != NULL){preorder_treechild(proot->pleftchild);}if(proot->prightchild != NULL){preorder_treechild(proot->prightchild);}printf("%d ",proot->no);return 0;
}int destroy_treechild(treenode *proot)
{if(proot->pleftchild){destroy_treechild(proot->pleftchild);}if(proot->prightchild){destroy_treechild(proot->prightchild);}free(proot);proot = NULL;return 0;
}

层序遍历

int layoutorder_treechild(treenode *proot)
{linkqueue *ptmpqueue = NULL;treenode *ptmpnode = NULL;ptmpqueue = creat_empty_linkqueue();enter_data_linkqueue(ptmpqueue, proot);while(!is_empty_linkqueue(ptmpqueue)){ptmpnode = out_data_linkqueue(ptmpqueue);printf("%d ", ptmpnode->no);if(ptmpnode->pleftchild != NULL){enter_data_linkqueue(ptmpqueue,ptmpnode->pleftchild);}if(ptmpnode->prightchild != NULL){enter_data_linkqueue(ptmpqueue, ptmpnode->prightchild);}}destroy_linkqueue(&ptmpqueue);return 0;
}
http://www.lryc.cn/news/612849.html

相关文章:

  • 【物联网】基于树莓派的物联网开发【24】——树莓派安装influxDB时序数据库
  • 关于AI应用案例计算机视觉、自然语言处理、推荐系统和生成式AI四大领域的详细技术分析。
  • 时序数据库的功能与应用价值
  • uniapp-vue2导航栏全局自动下拉变色
  • 护网行动之后:容器安全如何升级?微隔离打造内网“微堡垒”
  • imx6ull-驱动开发篇12——GPIO子系统驱动LED
  • Android Studio(2025.1.2)Gemini Agent 使用指南
  • 如何使用 pnpm创建Vue 3 项目
  • Vue内置动画组件 Transition
  • 【FreeRTOS】(号外)任务间通讯2: 信号量- Counting Semaphore
  • 前端发布 发布前端项目流程
  • Spring AI + Redis:构建高效AI应用缓存方案
  • 华为 2025 校招目标院校
  • 杂谈:大模型与垂直场景融合的技术趋势
  • 高通芯片漏洞被在野利用,谷歌发布紧急安卓补丁
  • Swift 实战:高效设计 Tic-Tac-Toe 游戏逻辑(LeetCode 348)
  • ansible-playbook之yum
  • Daemon Tools for Mac —— 专业虚拟光驱与磁盘映像工具
  • LeetCode 面试经典 150_数组/字符串_除自身以外数组的乘积(13_238_C++_中等)(前缀积)
  • 数据结构初阶(5)队列
  • java - 深拷贝 浅拷贝
  • KT148A 语音芯片自研板烧录方案:接口预留与电路连接指南
  • 线上业务突然流量掉 0 ?一次 DNS 污染排查与自救实录
  • itextPdf获取pdf文件宽高不准确
  • 无人机航拍数据集|第8期 无人机海上目标检测YOLO数据集3641张yolov11/yolov8/yolov5可训练
  • BES2700量产项目
  • 7. 什么是事件委托
  • 经营帮:重构企业经营全流程,打造产业互联网新生态
  • 上位机知识篇---AT指令
  • LabVIEW实验室测试框架