20220805 第一组 于芮 集合和树(第二十五天)
数据结构
节点:数据结构中的基础,是构成复杂数据结构的基本组成单位
树(n个节点构成有限集)
在任意非空树中,有且只有一个根节点
当n>1时,其余节点可分为m个互不相交的有限集,n=0,称为空树
定义树的时候
1.根节点是唯一的,不能存在多个根节点
2.子树的个数没有限制,但一定是互不相交的
节点的度:这点拥有子节点的个数
节点关系
1.节点子树的根节点称为该节点的孩子节点,
相应该节点称为孩子节点的父节点,
树的深度(高度)
树中节点的最大层数
二叉树
n个节点的有限集合,如果n=0,就称为空二叉树
二叉树的特点
1,每个节点最多只有两颗子树,不存在大于2 的节点
2.左子树和右子树有顺序,顺序不能任意颠倒
3.即使树中某个节点只有一颗子树,也要区分是左子树还是右子树
二叉树的性质
1.在二叉树中,第I层上最多有2^(I-1)个节点
2.二叉树中,如果深度为K,那么最多有2^K-1个节点
3.如果n0=n2+1,度数为0和度数为2的节点数
4.完全二叉树中,具有N个节点的的完全二叉树的深度是log2n+1,其中log2n向下取整
5.若对含N个节点的完全二叉树,从上到下或从左到右进行1-N的编号,是对完全二叉树中任意一个编号为I的节点有以下特性
(1)若I=1,则i节点是二叉树的根节点,无父节点。否则,编号为I/2的节点为其父节点
(2)若I>n,则该节点无左孩子节点,否则编号为2i的节点为其左孩子节点
(3)若2i+1>n,则该结点无右孩子结点,否则,编号为2i+1的结点为右孩子结点
斜树
1.所有的节点都只有左子树的二叉树叫做左斜树,
所有节点都只有右子树的二叉树叫做右斜树
满二叉树
在一棵二叉树中,如果所有分支节点都存在左子树和右子树,所有的叶子都在同一层上,叫满二叉树
特点
1.叶子只能出现在下一层
2.非叶子结点的度一定是2
3,在同样深度的二叉树中,满二叉树中的节点个数最多,叶子数也最多
完全二叉树
对于一颗具有N个节点的二叉树按层编号,如果编号为
二叉树的存储结构
1.顺序存储(只适用于完全二叉树)
使用一维数组存储二叉树中的结点,并且结点的存储位置,就是数组的下标索引。
当二叉树为完全二叉树时,结点数刚好填满数组。
如果二叉树不是完全二叉树,采用顺序存储,顺序存储结构中已经出现了空间浪费的情况。
比如右斜树极端情况,采用顺序存储的方式是十分浪费空间。
顺序存储只适用于完全二叉树。
2.二叉链表
顺序存储不能满足要求,采用链式结构
可将节点数据结构定义成一个数据和两个指针域
二叉树的遍历(*****重点)
从根节点出发,按照某种次序依次访问二叉树中所有的节点,使得每个节点被访问依次且仅被访问一次
二叉树的访问次序可以分为四种(递归遍历)
自上而上,从左到右,每个节点会走三次
1.前序遍历
从二叉树的根节点出发,当第一次到达节点时,输出节点数据,按照先向左再向右的顺序
2.中序遍历
从根节点出发,当第二次到达节点时,输出节点数据,也是先向左再向右的顺序
3.后序遍历
从根节点出发,当第三次到达节点时,输出节点数据,也会按照先向左再向右的顺序
4.层次遍历
按照树的层次自上而下的遍历二叉树
其他的树分类
1.二叉查找树(二叉排序树)
(1)若左子树不为空,左子树的所有的值小于它的根节点的值
(2)若右子树不为空,右子树的所有的值大于它的根节点的值
(3)左右子树也是一个二叉查找树
(4)没有键值相等的点
2.平衡二叉树(AVL树)
含有相同节点的二叉树的不同形态,查找平均长度最小的二叉树
(1)要么是一颗空树,要么其根节点的左右子树的深度只差不超过1
(2)左右子树也都是一颗平衡二叉树
(3)二叉树的平衡因子定义为该节点的左子树的深度减去右子树的深度
平衡因子 = 左子树的深度 - 右子树的深度 -1 0 1
红黑树
自平衡的二叉树,节点的颜色只能是红色或黑色
1.根节点只能是黑色
2.红黑树中,所有的叶子结点后面再接上左右两个空节点,可以保持算法的一致性,所有的空节点都是黑色
3.其他的节点要么是黑色,要么是红色,如果是红色节点的父节点,则左右孩子节点都是黑色,红黑相间
4.在任意一颗子树中,从根节点向下走到叶子结点的空节点在路径上所经历的黑色节点数是相同的,保证平衡二叉树
B-树
是一种平衡的多路查找树,在文件系统中很有用
一颗m阶的B-树的性质
1.树中每个子节点之多有M棵子树
2.若根节点不是叶子结点,则至少有两颗子树
3.除根节点外,所有非终端节点,至少有m/2棵子树
4.每个节点的信息结构,(A0,K1,A1,K2....Kn,An),其中n表示关键字个数
K为关键字,A是指针
5.所有的叶子结点都出现在同一层次上,且不带任何信息
B+树
集合框架:存放数据的容器
使用集合的目的:更方便的存放和操作数据
集合继承结构
collection(接口):存放单值最大的父接口
list<e>(列表):和数组类似,list可以动态增长,查找元素效率高
插入删除元素的效率低,因为会引起其他元素位置的改变。
set<E>也是线性表,key和value。检索元素效率低,删除和插入的效率高,插入和删除不会引起
元素移位。
map<v>:存放对值的最大父接口,映射,用于保存具有映射关系的数据,保存着两组数据,
list和set继承自collection
list接口
ArrayList内部结构是一个数组(类)
创建一个ArrayList,使用多态创建集合,向上转型
如果初始化集合尽量指定初始化容量,如果确定不了,默认指定16
使用泛型,数据的类型的时候,一定要使用引用数据类型。
list集合存放的数据的特点
1.数据有顺序(添加的先后顺序)
2.数据可以重复
看了今天的学习笔记,我觉得今天真的好棒啊,学了这么多知识,又是很充实的一天!