1 基本构成

度为 2 的树 最大有两个孩子
类比计划生育 中最多 二胎
可以 0个就是空树 可一个 可两个 只限定最大值
理解1 就是由 根节点 和两个 左右 子树构成 或者 子树为空
理解2 每个节点下 有两个节点 其中 节点可为空
其次单个节点 也可以视作 子树
严格定义(数据结构标准说法)
- 子树:由一个根节点,加上它所有后代节点共同构成的集合。
- 叶子节点(没有孩子的节点):只有自己这一个节点,没有后代,依然满足「根节点+后代(空)」的规则,所以它本身就是一棵单节点子树。
只要有根,就能叫子树;单节点,是最小的子树
2 满二叉树 和 完全二叉树
一、满二叉树(完美二叉树)
定义每层结点都达到最大数量,没有缺结点:
除叶子结点外,所有节点都有左右两个子节点;
所有叶子结点在同一层。
计算 满二叉树 的总节点数
sum = 2^0 + 2^1+......+2^(h-1)
利用等比数列求和公式

Sum = 2 ^ h -1



二、完全二叉树
定义
按从上到下、从左往右顺序依次填满结点,只允许最后一层右侧缺叶子:
除最后一层外,上面所有层都是满二叉树;
zhong yao
最后一层结点靠左连续排布,右侧空缺,
不能中间空、右边有结点 
3 物理结构(存储结构) 和 逻辑结构
简单来说,逻辑结构是我们 "脑海中" 对数据关系的抽象,
而物理结构是数据在 "计算机内存中" 的真实安家方式。

两者的核心区别在于视角:
物理结构描述数据在介质上的实际存放方式。
连续存储(如C数组)把元素一个接一个排在内存里;
离散存储(如链表节点)则分散在各处,用指针串联。磁盘上文件系统的块分配也属于这一层面。
程序员通常不直接操控这一层,操作系统和硬件负责管理**。**

逻辑结构描述数据元素之间的抽象关系,与存储在哪里无关。常见类型:
- 线性:一对一(数组、链表、队列、栈)
- 树形:一对多(二叉树、B树、堆)
- 图形:多对多(有向图、无向图)
- 集合:无特定顺序关系
关键联系**:同一种逻辑结构可以用不同物理结构来实现。**
比如"栈"(逻辑上是线性后进先出)既可以用连续的数组实现,
也可以用离散的链表实现------逻辑行为一样,物理布局截然不同。
个人理解
简单来看就是 受限于已有的物理空间的存储结构来实现抽象的逻辑结构
比方说 堆 就想象为 用数组 实现的 二叉树
在代码上操作的是数组 想象在操作一棵树一样的感觉
优秀的程序员,就是在死板的、受限的物理内存之上,
通过精妙的算法,搭建出极其灵活且复杂的逻辑世界。
4 利用 数组 实现 完全二叉树
带着结论看问题
1 从根节点开始 从左至右 从上到下 下标从0开始 存储节点
就是利用 结构体数组 实现完全二叉树 有什么好处嘛?
2 优势 利用下标计算 ( 完全二叉树 包含 满二叉树 ) 父子关系
思考一下 假设父亲的下标是 i 求孩子下标
左孩子 的下标表达式为 就看 A和B就好 不就是 i+1嘛?这对吗?
不对 多看机组 用数学归纳法 看出 普遍的规律 B和 D 还有 C和F
**明显是 2i+1 得出结论1:**左孩子 的下标表达式为 2i+1
同理可得 右边的孩子呢?
就是 2i+2 也可以理解为就是 在左孩子的下标 +1 不就是相邻的嘛 而且是有序的 右 孩子 的下标表达式为 2i+1+1 **==**2i+2


直接自己去 验证 没毛病的
假设 孩子的节点的下标为 j 求父亲的下标
不就是反过来嘛? 如果为奇数就 下标-1 再/2
如果为偶数那不就 下标-2 再/2
不不不 我们可以统一起来
因为 整数除法向下取整的原则 所以
不论是偶数还是奇数 都可以用 (下标 - 1 ) /2
(5 -1)/2 和 (6-1)/2 结果都是 2
最后 得出结论
假设 孩子的节点的下标为 j 父亲的下标 === ( j-1) /2
5 注意 上述结论的前提最后好 是 完全二叉树



