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