2022 -8- 5 第八组 曹雨 集合
集合
前提知识:树
是n(n>=0)个结点的有限集,n=0,称为空树,反之为非空树
在任意的非空树中:
- 有且仅有一个特定的称为根结点
- 当n>1时,其余结点可分为m个互不相交的有限集
定义树的时候:
- 根节点是唯一的,不能存在多个根节点
- 子树的个数没有限制,但他们一定是互不相交的
结点的度:
结点拥有子节点的数量称为结点的度。
树的深度:
树中结点的最大层数称为树的深度或高度。
二叉树:
二叉树是n个结点的有限集合,如果n=0,那就称为空二叉树。
二叉树的特点:
- 每个结点最多只有两颗子树,所以二叉树中不存在度大于2的结点
- 左子树和右子树是有顺序的,次序不能任意颠倒
- 即使树种某个结点只有一颗子树,也要区分它是左子树还是右子树
二叉树的性质:
- 在二叉树中第i层上最多有2^(i-1)个结点(i>=1)
- 二叉树中如果深度为k,那么最多有2^k-1个结点。
- n0=n2+1,n0表示度数为0的结点,n2表示度数为2的结点数
- 在完全二叉树中,,具有n个结点的完全二叉树的深度为[log2n] +1, 其中[log2n]是向下取整
- 若对含n个结点的完全二叉树从上到下且从左到右进行1至n的编号,则对完全二叉树中任意一个编号为i的结点有如下特性:
(1)若i=1,则该结点是二叉树的根,无父节点,否则,编号为i/2的结点为其父节点
(2)若2i>n,则该结点无左孩子结点,否则,编号为2i的结点为其左孩子结点
(3)若2i+1>n,则该结点无右孩子结点,否则,编号为2i+1的结点为右孩子结点
二叉树的存储结构:
1.顺序存储
使用一维数组存储二叉树中的结点,并且结点的存储位置,就是数组的下标索引。
当二叉树为完全二叉树时,结点数刚好填满数组。
如果二叉树不是完全二叉树,采用顺序存储,顺序存储结构中已经出现了空间浪费的情况。
比如右斜树极端情况,采用顺序存储的方式是十分浪费空间。
顺序存储只适用于完全二叉树。
二叉树遍历:
前序遍历
从二叉树的根结点出发,按照先向左再向右的方向访问。(根左右)
后序遍历
从二叉树的根结点出发,先向左再向右的方向访问。(左右根)
中序遍历
从二叉树的根结点出发,按照先向左再向右访问。(左根右)
层次遍历
按照树的层次自上而下的遍历二叉树。ABCDEFGHIJ
二叉链表
顺序存储不能满足二叉树的存储要求,采用链式存储。二叉树的每个结点都有两个孩子。可以将结点数据结构定义成一个数据和两个指针域。数据结点:
斜树:
所有的结点都只有左子树的二叉树叫做左斜树。所有结点都是只有右子树的二叉树叫右斜树。
满二叉树:
在一颗二叉树中,如果所有分支结点都存在左子树和右子树,并且所有的叶子都在同一层上,这样的二叉树叫做满二叉树。
-
满二叉树的特点:
- 叶子只能出现在下一层。
- 非叶子结点的度一定是2
- 在同样深度的二叉树中,满二叉树的结点个数最多,叶子数也最多。
-
完全二叉树:
- 对一颗具有n个结点的二叉树按层编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点位置完全相同。
- 这颗二叉树就称为完全二叉树。
红黑树(HashMap重点应用):
自平衡二叉树,增加一个颜色的属性。结点的颜色只能是红色或者黑色
- (1)根节点只能是黑色
- (2)红黑树中,所有的叶子结点后面再接上左右两个空结点,保持算法的一致性,所有的空结点都是黑色
- (3)其他的结点要么是黑色,要么是红色,红色结点的父节点和左右孩子结点都是黑色,黑红相间
- (4)在任一颗子树中,从根节点向下走到空结点的路径上所经理的黑结点数相同,平衡二叉树
B-树(B树)
B-树是一种平衡多路查找树,它在文件系统中很有用。一颗m阶B-树
- (1)树中每个子节点至多有m颗子树
- (2)若根节点不是叶子结点,则至少有2棵子树
- (3)除根节点外所有非终端结点至少有[m/2]棵子树
- (4)每个结点的信息结构(A0,K1,A1,K2....Kn,An),其中n表示关键字个数
K为关键字,A是指针 - (5)所有的叶子结点都出现在同一层次上,且不带任何信息。
集合框架
集合(存放数据的容器)
使用集合的目的:更方便的储存和操作数据
集合继承结构
-
Collection
:存放单值的最大父接口 - List
(列表)线性表:和数组类似,List可以动态增长,查找元素效率高
插入删除元素的效率低,因为会引起其他元素位置的改变。 - Set
也是线性表,检索元素效率低,删除和插入的效率高,插入和删除不会引起
元素移位。
补充:Set集合为什么是无序且不能重复的:Set系列集合添加元素无序的根本原因是因为底层采用了哈希表存储元素(JDK1.8之前:哈希表=数组+链表+(哈希算法),JDK1.8之后:哈希表=数组+链表+红黑树+(哈希算法))
- List
-
Map<K,V>:存放对值的最大父接口
Map(映射)用于保存具有映射关系的数据,Map保存着两组数据:key和value。
key和value都可以是任意的引用数据类型,但key不能重复。
List,Set继承自Collection,Map不是
新增一个集合的方法
注意:
1.如果初始化集合尽量指定初始化容量,如果确定不了,默认指定为16
2.使用泛型,数据的类型时候,一定要使用引用数据类型。
List<Integer> l1 = new ArrayList<>();
//新增一个数据
l1.add(1);
//清空集合
l1.clear();
// 直接打印集合对象
System.out.println(l1);
集合和数组之间的转换
数组--->集合
int [] arr = new int[]{1,2,3,4,5};
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> integers1 = List.of(1, 23, 4, 5);
List<int[]> arr1 = List.of(arr);
System.out.println(arr1.get(0)[0]);
集合常用方法
ArrayList类常用方法
add(Object o) 在列表的末尾添加元素
add(int index, Object o) 在指定位置添加元素o,索引位置必须介于0和 列表中元素的个数之间(如果这个位置有元素,会把原有元素依次向后移动)
size() 返回集合中的元素个数(等价于:length())
get(int index) 返回指定索引处的元素
set(int index, Object o) 将index索引处的元素替换成元素o
contains(Object o) 判断列表中是否存在指定元素o
indexOf(Object o) 返回元素o在集合中的索引
remove(Object o) 从集合中删除元素o
remoce(int index) 从集合中删除索引是index处的元素
isEmptg() 判断集合是否为空
clear() 清空集合中的元素
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】