二叉树、红黑树、集合(学习笔记)

01-数据结构

树结构介绍

  • 特点

    • 每一个节点有零个或者多个节点

    • 没有父节点的节点称之为根节点,一个树最多有一个根节点

    • 每一个非根节点有且只有一个父节点

二叉树

  • 如果树中的每个节点的子节点个数不超过2,那么该树就是一个二叉树

二叉查找树

  • 二叉树的特点

    • 左子树上所有的节点的值均小于等于他的根节点的值

    1. 右子树上所有的节点值均大于或者等于他的根节点的值

    2. 每一个子节点最多有两个子树

    3. 目的:提高检索数据的性能。

  • 弊端

    • 二叉查找树有可能会出现"瘸子"的现象,影响查询效率。

  • 网站

平衡二叉树

  • 平衡二叉树是在满足查找二叉树的大小规则下,让树尽可能爱笑

  • 旋转:

    在构建一棵平衡二叉树的过程中 当有新的节点要插入进来以后 我们需要校验新节点的插入是否破坏了树的这种平衡结构, 如果是,则需要对树做调整,以改变树的结构 让其成为一个平衡二叉树;而调整就需要涉及到树的旋转

红黑树

  • 核心 :

  1. 根节点是黑色

  2. 红色的不能连一起

  3. 从任意节点开始, 走到叶子节点 , 左右两边的黑色点数, 需要一致

02-Set集合

Set集合特点回忆

  • 无序:存取顺序不一致

  • 不重复:可以去除重复

  • 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素。

要学习的类

  • HashSet : 无序、不重复、无索引。 【作用 : 元素去重】

  • LinkedHashSet:有序、不重复、无索引。 【作用 : 去重, 还要保证顺序不变】

  • TreeSet:排序、不重复、无索引。 【作用 : 排序】

HashSet底层哈希表

  • 介绍:

    JDK8之前的,底层使用【数组+链表】组成 JDK8开始后,底层采用【数组+链表+红黑树】组成

1. 根据元素的哈希值跟数组的长度计算出应存入的位置
2. 判断当前位置是否为null,
      如果是null直接存入,如果位置不为null,表示有元素
      则调用equals方法比较属性值
      如果一样,则不存,如果不一样,则存入数组。
3. 当数组存满到16*0.75=12时,就自动扩容,
      每次扩容原先的两倍
  • 总结

    • HashSet 今后存储的对象, 如果是自定义类型 别忘了重写 hashcode 和 equals 方法

LinkedHashSet加入了双向链表

  • 在hashSet的基础上加入了双向链表,使集合变得有序

TreeSet红黑树

  • 作用

    • 对数据排序

  • 注意

    • 如果存储的是自定义对象, 还没有实现过 Comparable 接口

      运行的时候, 将会出现 ClassCastException

  • 排序方式1

    • 让类实现 Comparable接口, 重写 compareTo 方法

  • 排序方式2

    • 在构造方法里, 传入Comparator , 重写 compare 方法

  • 比较规则

两种方式中,关于返回值的规则:
​
如果认为第一个元素大于第二个元素返回正整数即可。
如果认为第一个元素小于第二个元素返回负整数即可。
如果认为第一个元素等于第二个元素返回0即可,此时Treeset集合只会保留一个元素,认为两者重复。

    
 @Override
    public int compareTo(Person o) {
        int result = this.age - o.age;
        result = this.age == o.age ? this.name.compareTo(o.name) : result;
        result = result == 0 ? 1 : result;
        return result;
    }
//CompareTo方法中this代表传进来的参数,o代表已经传入进来的参数
//拿着this(传进来)的参数和o(已经进来的元素)进行比较,如果this-o是正数则存入树的右边,取出效果就是正序排列
//如果this-o是负数则存入树的左边,取出效果就是倒序排列
//所以想要正序排列或者倒序排列,直接控制o-this  或者 this-o 即可
  • 同时指定两种排序方式

    • 优先用比较器的排序方式

03-Collections

可变参数

  • 可变参数指的是,参数的个数可变

    如果方法的【参数类型】已经确定,【个数】不确定, 我们可以使用可变参数

  • 底层是一个数组实现

  • 可变参数是需要三个点,点的数量不允许改变 不要将 ... 写在类型的前面 如果可变参数是方法中的第一个参数,后面将不允许再定义参数,因为接收不到

作用

  • Collections并不属于集合,是用来操作单列集合的工具类。

04-Map集合

介绍

Map集合是一种双列集合,每个元素包含两个数据。
Map集合的每个元素的格式:key=value(键值对元素)。
Map集合也被称为“键值对集合”
​
-------------------------------------
Collection集合的格式: [元素1,元素2,元素3..]
​
Map集合的完整格式:
{key1=value1 , key2=value2 , key3=value3 , ...}

场景

  • 淘宝购物车,商品可以看成一个key,而数量可以看成value

特点

  • 要知道, Map集合中底层的数据结构, 只针对键有效 !!!

    • HashMap : 哈希表, key (键) 是唯一的

    • LinkedHashMap : 哈希表 + 链表 , key (键) 唯一, 有序

    • TreeMap : 红黑树, key (键) 排序

常用方法

Map集合的遍历方式

//第一种集合遍历方式,调用key来获取每个对应的value
HashMap<String,String> hm=new HashMap<>();
        hm.put("张三","北京");
        hm.put("王五","上海");
        hm.put("徐毅","北京");
        Set<String> s = hm.keySet();
        for (String key : s) {
            String value = hm.get(key);
            System.out.println(key+"----"+value);
        }
//第二种集合遍历方式,通过entrySet方法获取集合对象,通过集合对象的getKey/getValue方法获取
 Set<Map.Entry<String, String>> en = hm.entrySet();
        for (Map.Entry<String, String> et : en) {
            System.out.println(et.getKey()+"-----"+et.getValue());
        }
//第三种通过foreach方法遍历
hm.forEach(new BiConsumer<String, String>() {
            @Override
            public void accept(String s, String s2) {
                System.out.println(s+"----"+s2);
            }
        });

HashMap

  • 特点以及底层原理

    • 由键决定:无序、不重复、无索引。HashMap底层是哈希表结构的。

  • 依赖hashCode方法和equals方法保证键的唯一。 如果键要存储的是自定义对象,需要重写hashCode和equals方法。 基于哈希表。增删改查的性能都较好。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java+每天进步亿点点

一起学习一起进步一起高薪

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值