以下部分图参考懒猫老师《数据结构》相关课程内容,作学习笔记
目录
二叉树的特点:
(1)每个结点最多有两棵子树;
(2)二叉树是有序的,其次序不能任意颠倒;
特殊的二叉树:
(1)斜树
1,所有结点都只有左子树的二叉树称为左斜树;
2,所有结点都只有右子树的二叉树称为右斜树;
特点:
1,在斜树中,每一层只有一个结片
2,斜树的结点个数与其深度相同。
(2)满二叉树
在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上。
满二叉树在同样深度的二叉树中结点个数最多;在同样深度的二叉树中叶子结点个数最多
特点:
1,叶子只能出现在最下一层
2,只有度为0和度为2的结点
(3) 完全二叉树
完全二叉树的结点编号与同样深度的满二叉树的编号在相同位置上完全相同;也可以理解成,在满二叉树中,从最后一个结点开始,连续去掉任意个结点,即是一棵完全二叉树。
特点:
1,叶子结点只能出现在最下两层且最下层的叶子结点都集中在二叉树的左面;
2,完全二叉树中如果有度为1的结点,只可能有一个,且该结点只有左孩子。
3,深度为k的完全二叉树在k-1层上一定是满二叉树。4,在同样结点个数的二叉树中,完全二叉树的深度最小
二叉树基本性质小结:
(性质4,5针对的是完全二叉树)
二叉树的存储结构:
(1)二叉树顺序存储
即用一个数组来进行存储,按照完全二叉树的编号方式存储,没有的编号即不赋值,如下图,对下面二叉树的编号方式:
但是当二叉树为斜树时,仍会按完全二叉树的编号存储,会造成很大的存储空间的浪费,所以二叉树的顺序储存一般只用来存储完全二叉树。
(2)二叉链表
二叉树的每个结点对应链表的每个结点,数据域存储二叉树结点内容,两个指针域分别指向左右孩子
具有n个结点的二叉链表中,有n+1个空指针
(可以这样理解,除根结点外,其他每个结点都连接一条边,总共就是n-1条边,一条边占用一个指针域,总共有2n个指针域,则空的指针域为2n-(n-1)=n+1)
数据结构:
typedef struct binarytree{
Datatype data;//数据内容
struct binarytree* Lchild;//指向左孩子结点
struct binarytree* rchild;//指向右孩子结点
}binarytree;
但是会发现,如果要访问一个结点的双亲用二叉链表怎么实现呢?发现二叉链表是无法直接通过结点访问到双亲的,这里就引入了三叉链表
(3)三叉链表
3.1链表形式
在二叉链表的基础上增加了一个指向双亲的指针域
数据结构:
typedef struct binarytree1{
Datatype data;//数据内容
struct binarytree1* Lchild;//指向左孩子结点
struct binarytree1* rchild;//指向右孩子结点
struct binarytree1* parent;//指向双亲结点
}binarytree1;
3.2静态链表(数组)
左右孩子和双亲结点都储存的是其下标在数组中,这种编号方式是直接顺序标下标
如下图:
数据结构:
typedef struct binarytree2{
Datatype data;//数据内容
int Lchild;//左孩子下标
int rchild;//右孩子下标
int parent;//双亲下标
}binarytree2;
初学小白,有错误欢迎指正喔!~