2022-8-5 第一小组 甘源册 学习笔记

时间:2022-08-05
本文章向大家介绍2022-8-5 第一小组 甘源册 学习笔记,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

知识点掌握情况

树(了解) List集合(理解)

学习心情

集合挺简单,作业很痛苦。

1.树(Tree)

  • 结点:结点是数据结构中的基本,构成复杂数据结构的基本组成单位
  • 树(Tree):是n(n>=0)个结点的有限集,n=0,称为空树。
  • 在任意的非空树中:
    • 有且仅有一个特定的称为根节点
    • 当n>1,其余结点可分m个互不相交的有限集
  • 定义树
    • 根节点是唯一的,不能存在多个根节点
    • 子树的个数没有限制,但他们一定是互不相交的
  • 树的定义中,使用了递归。递归在树的学习过程中起着重要的作用
  • 结点的度
    • 结点拥有子节点的数量称为结点的度
  • 结点的关系
    • 结点子树的根节点称为该结点的孩子结点
    • 相应该结点称为孩子结点的父结点(双亲结点)
  • 结点的层次
    • 根结点为一层
  • 树的深度
    • 树中结点的最大层数称为树的深度或高度

1.1二叉树

  • 二叉树是n个结点的有限集合,如果n=0,那就称为空二叉树。
  • 二叉树特点
    • 每个结点最多只有两棵子树,所以二叉树中不存在于度大于2的结点
    • 左子树和右子树是有顺序的
    • 即使这个树中某个结点只有一棵子树,也要区分它是左子树还是右子树
  • 二叉树的性质
    1. 在二叉树中第i层上最多有2^(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的结点有如下特性:
      • 若i=1,则该结点是二叉树的跟,无父节点,否则,编号为i/2的结点为其父结点
      • 若2i>n(编号),则该结点无左孩子结点,否则,编号为2i的结点为其左孩子结点
      • 若2i+1>n,则该结点无右孩子结点,否则,编号为2i+1的结点为右孩子结点

1.2斜树

  • 所有的结点都只有左子树的二叉树——左斜树
  • 所有的结点都只有右子树的二叉树——右斜树

1.3满二叉树

  • 在一个二叉树中,如果所有分支结点都存在左子树和右子树,并且所有的叶子都在同一层上——满二叉树
  • 满二叉树的特点
    • 叶子只能出现在下一层。
    • 非叶子结点的度一定是2。
    • 在同样的深度的二叉树中,满二叉树的结点的个数最多,叶子树也最多。

1.4完全二叉树

  • 对一棵具有n个结点的二叉树按层编号,如果编号为i(1<=i<=n)的结点于同样深度的满二叉树中编号为i的结点相同——完全二叉树

1.5二叉树的存储结构

  • 顺序存储

    • 使用一维数组来存储二叉树中的结点,并且结点的存储位置,就是数组的下标索引
    • 当二叉树为完全二叉树时,结点的数刚好填满数组。
    • 如果二叉树不是完全二叉树,采用顺序存储,会出现空间浪费的情况
  • 二叉链表

    • 顺序存储不能满足二叉树的要求,采用链式存储。
    • 二叉树的每个结点都有两个孩子
    • 可以将结点数据结构定义成一个数据和两个指针域

1.6二叉树的遍历(重点)

  • 从跟结点出发,按照某种次序依次访问,二叉树中所有的结点,使得每个结点被访问一次,且仅被访问一次
  • 二叉树的访问次序可以分为四种:
    • 递归遍历:
  • 自上而下,从左到右,每个结点会走三次
    • 前序遍历
      • 从二叉树的根结点出发,当第一次到达结点时就输出结点数据,按照先向左,再向右的方向访问。(根左右
    • 中序遍历
      • 从根结点出发,先向左,再向右的方向访问。(左根右
    • 后序遍历
      • 从根结点出发,先向左,在向右的方向访问。(左右根
    • 层次遍历

1.7其他树的分类

  • 二叉查找树(二叉搜索树,二叉排序树)
    • 若左子树不为空,所有左子树的值都是小于它的根结点的值
    • 若右子树不为空,所有右子树的值都是大于它的根结点的值
    • 左右子树也是一个二查找叉树
    • 没有键值相等的点
  • 平衡二叉树(AVL树)
    • 含有相同结点的二叉树的不同形态,找出一个查找平均长度最小的一棵二叉查找树
      • 要么是一棵空树,要么其根结点的左右子树的深度之差的值不超过1
      • 左右子树也都是平衡二叉树
      • 二叉树结点的平衡因子定义为该结点的左子树的深度减去右子树的深度。
      • 【平衡因子=左子树深度-右子树深度(-1,0,1)】
  • 红黑树(HashMap重点应用)
    • 自平衡的二叉树。又增加了一个颜色的属性,结点的颜色只能是红色或黑色
      • 根结点只能是黑色,必须是黑色
      • 红黑树中,所有的叶子结点后面再接上左右两个空结点,可以保持算法的一致性,所有的空结点一致是黑色
      • 其他的结点要么是黑色,要么是红色,红色结点的父结点和左右孩子结点都是黑色,黑红相间
      • 任意一棵子树中,从根节点向下走到空节点的路径上所经过的黑节点的数目相同,从而保证了是一个平衡二叉树
  • B-树(B树)——了解即可
    • B-树是一种平衡多路查找树,它在文件系统中很有用。一棵m阶的B-树
      • 树中每个子结点至多有m棵子树
      • 若根结点不是叶子结点,则至少有2棵子树
      • 除了根结点外所有非终端结点至少有[m/2]棵子树
      • 每个结点的信息结构(A0,K1,A1,K2......Kn,An),n表示关键字个数,K为关键字,A为指针
      • 所有的叶子结点,都出现在同一层次上,且不带任何信息。
  • B+树——了解即可
  • B-树和B+树,在后序数据库阶段才会重点应用

2.集合

  • 集合是存放数据的一个容器
    • 目的:更方便的存储和操作数据,CRUD。
  • Collection接口——存放单值的最大父接口
    • List(列表)线性表:和数组类似,List可以动态增长,查找元素的效率高,插入删除元素的效率低,因为会引起其他元素位置的改变。
    • Set线性表:查询元素的效率低,删除插入效率高,插入和删除不会引起元素的移位。
  • Map<K,V>——存放对值的最大父接口
    • Map(映射)用于保存具有映射关系的数据,Map保证着两组数据:key和value
    • key和value都可以是任意的引用数据类型,【但key不能重复】

2.1 ArrayList

  • 内部结构是一个数组

    •     // 创建了一个集合
          ArrayList<Integer> l2 = new ArrayList<>();
          //开发中一般情况下,会使用多态来创建集合--向上转型
          List<Integer> l1 = new ArrayList<>();
          // 数组转换成集合--把数组当成一个元素传入集合
          int[] ints = new int[12];
          List<int[]> ints1 = List.of(ints);
          // 把多个数据(数组)转换成集合
          List<Integer> integers = Arrays.asList(1, 2, 3, 4);
          // 数组和集合之间的互相转换,建议自己封装一个工具类
          
      
    • 尽量指定初始化容量,如果确定不了,默认指定为16

    • 使用泛型,数据的类型的时候,一定要使用引用数据类型。

  • List集合中存放的数据

    • 数据有顺序(添加的先后顺序)
    • 数据可以重复

原文地址:https://www.cnblogs.com/gycddd/p/16555630.html