这次我们来学习一下数据结构中的二叉树
1. 二叉树的概念及结构
1.1 二叉树的定义
定义:所有结点的度小于等于2的树。
上图中可以看出
- 二叉树不存在度大于2的结点
- 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树。
任意二叉树都是由以下几种情况复合而成的
1.2 特殊的几种二叉树
完全二叉树
完全二叉树。一棵高度为h的二叉树, 除最后一层以外的其他所有层上的结点数都达到最大值,而最后一层上的所有结点 分布在该层最左边的连续的位置 上。
完全二叉树有如下特点,叶子结点只能在层次最大和次大的两个层次上出现。对任一结点,如果其左子树的高度为m,则其右子树的高度必为m或者m-1。
满二叉树
满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2^k -1,则它就是满二叉树。
注意:满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树!!!
扩充二叉树
把原二叉树所有结点中出现空的子树的位置都增加特殊的结点--空树叶,得到的二叉树就是扩充二叉树。
2.二叉树的性质
1.若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 2⁽ⁱ⁻¹⁾ 个结点。
2.若规定根节点的层数为1,则深度为h的二叉树的最大结点数是 2ʰ-1。
3.对任何一棵二叉树,如果度为0其叶结点个数为n₀,度为2的分支结点个数为n₂,,则有n₀=n₂+1
4.若规定根节点的层数为1,具有n个结点的满二叉树的深度, h=log₂(n+1)。
(ps:log₂(n+1))是 log以2为底,n+1为对数)
5.对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有结点从0开始编号,则对于序号为 i 的结点有:
- **若i>0,i 位置节点的双亲序号:(i-1)/2;**i=0,i为根节点编号,无双亲节点
- 若2l+1<0,左孩子序号:2i+1,2i+1 >=n 否则无左孩子
- 若2i+2<0,右孩子序号:21+2,2l+2>=n否则无右孩子
3. 二叉树的存储结构
二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。
1. 顺序存储
顺序结构存储就是使用数组来存储 ,一般使用数组只适合表示完全二叉树 ,因为不是完全二叉树会有空间的浪费。而现实中使用中++只有堆才会使用数组来存储++ 。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。
2. 链式存储
二叉树的链式存储结构是指,用链表来表示一棵二叉树 ,即用链来指示元素的逻辑关系。 通常的方法是 链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所 在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前学习中一般都是二叉链,高阶数据结构如红黑树等会用到三叉链。
cpp
typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
struct BinTreeNode* _pRight; // 指向当前节点右孩子
BTDataType _data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pParent; // 指向当前节点的双亲
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
struct BinTreeNode* _pRight; // 指向当前节点右孩子
BTDataType _data; // 当前节点值域
少年没有乌托邦,心向远方自明朗!
如果这个博客对你有帮助,给博主一个免费的点赞就是最大的帮助❤
欢迎各位点赞,收藏 和关注 哦❤
如果有疑问或有不同见解,欢迎在评论区留言❤
后续会继续更新大连理工大学 相关课程和有关数据结构 的内容和示例
点赞加关注,学习不迷路,好,本次的学习就到这里啦!!!
我们下次再见喽!