DS 0929(第五章 二叉树)

本文详细介绍了二叉树的概念,包括其特点、不同类型如满二叉树和完全二叉树,以及二叉排序树和平衡二叉树。重点讲述了二叉树的存储结构,包括顺序存储和链式存储的优缺点,并强调了顺序存储主要适用于完全二叉树。此外,还讨论了构建二叉树的过程和链式存储的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树

  1. 或者为空二叉树
  2. 或者是一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一颗二叉树。

特点

  • 每个结点之多有两颗子树
  • 左右子树不可以颠倒(二叉树是有序树)
  • 注意与度为二的有序树的区别

几个特殊的二叉树

  1. 满二叉树
    在这里插入图片描述
    特点:
    只有最后一层有叶子结点,
    不存在度为1的结点,
    按层序从1开始编号,结点i的左孩子为2i,右孩子为2i+1;结点i的父节点为i/2

  2. 完全二叉树
    在这里插入图片描述
    特点:
    只有可能在最后两层出现叶子结点,
    最多只有一个度为1的结点
    同满二叉树子节点,父节点算法
    在这里插入图片描述
    如果某个结点只有一个孩子,那么一定是左孩子

  3. 二叉排序树
    一颗二叉树或是空二叉树,具有以下性质
    左子树上所有结点的关键字都小于根结点的关键字
    右子树上所有的结点的关键字都大于根节点的关键字
    左子树和右子树又各是一颗二叉排序树

  4. 平衡二叉树
    树上任一结点的左子树和右子树的深度之差不超过1
    平衡二叉树能有更高的搜索效率

二叉树的常考性质

1. 设非空二叉树中度为0,1,2的结点个数分别为x,y,z,则x=z+1,叶子结点比二分支结点多1个

假设书中结点总数为n,则
》n=x+y+z
》n=y+2z+1 (树的结点树=总度数+1)

2. 二叉树的第i层至多有2的i-1次方个结点,(m叉树的第i层之多有m的i-1次方个结点)
3.
在这里插入图片描述

完全二叉树的常考性质

  1. 具有n个结点的完全二叉树的高度h为
    在这里插入图片描述
  2. 对于完全二叉树,如果知道结点数n,则可以推出度为0,1,2的结点个数
### DS18B20与二叉树在Proteus中的仿真实现 DS18B20是一种数字温度传感器,具有单总线接口,能够直接输出温度数据[^2]。结合二叉树的数据结构进行仿真或实现,可以通过以下方式完成: #### 1. **DS18B20的硬件连接** 在Proteus中,DS18B20的连接通常包括一个4.7kΩ的上拉电阻连接到VCC和数据线之间。DS18B20的数据线(DQ)通过单总线协议与微控制器通信。常用的微控制器如51系列单片机可以作为主控设备,负责与DS18B20交互并处理温度数据。 ```c // 初始化DS18B20 void DS18B20_Init() { DQ = 1; // 拉高数据线 delay_us(1); // 延时1us DQ = 0; // 主机将数据线拉低 delay_us(750); // 延时至少480us DQ = 1; // 主机释放总线 delay_us(60); // 等待从机响应 } ``` #### 2. **温度数据读取** DS18B20的温度读取需要遵循严格的时序要求,例如主机在7μs时间内将数据线从高拉低,并确保第二次读取前将数据线重新拉高[^2]。以下是读取温度的基本代码示例: ```c unsigned char DS18B20_ReadByte() { unsigned char i, dat = 0; for (i = 0; i < 8; i++) { DQ = 0; // 主机拉低数据线 delay_us(2); // 延时2us DQ = 1; // 主机释放总线 if (DQ) { // 如果从机拉高 dat |= 0x01 << i; // 设置对应位为1 } delay_us(60); // 等待从机响应 } return dat; } ``` #### 3. **二叉树的数据存储** 假设需要将DS18B20采集的温度数据存入二叉树中进行管理。二叉树节点定义如下: ```c typedef struct TreeNode { float temperature; // 温度值 struct TreeNode *left, *right; // 左右子节点指针 } TreeNode; ``` 插入温度数据的函数如下: ```c TreeNode* insert(TreeNode* root, float temp) { if (root == NULL) { root = (TreeNode*)malloc(sizeof(TreeNode)); root->temperature = temp; root->left = root->right = NULL; } else if (temp < root->temperature) { root->left = insert(root->left, temp); } else { root->right = insert(root->right, temp); } return root; } ``` #### 4. **Proteus仿真配置** 在Proteus中,可以使用笙泉THO65B+仿真器进行调试[^1]。将DS18B20与51系列单片机连接后,编写上述代码并下载到仿真器中运行。通过Proteus的虚拟终端或LED显示模块,观察温度数据是否正确存储到二叉树中。 #### 5. **动态显示与错误排查** 如果仿真过程中出现异常,可以通过动态显示的方式定位问题。例如,在关键代码段调用显示子程序,验证程序执行路径是否符合预期。若发现读取失败,需检查DS18B20的读时序是否满足要求[^2]。 ```c void dynamic_display(float temp) { if (temp >= 0 && temp <= 99) { printf("%.2f\n", temp); // 显示温度 } else { printf("err\n"); // 超范围显示错误 } } ``` ### 结论 通过上述方法,可以在Proteus中实现DS18B20与二叉树的相关仿真实现。确保硬件连接正确、时序严格遵守,并结合动态显示功能排查潜在问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值