• 【数据结构】搜索树&Map&Set


    目录

    1.搜索树

    1.1概念

    1.2查找

    1.3插入

    1.4删除

    2.Map

    2.1map说明

    2.2TreeMap和HashMap

    2.3常用方法

    3.Set

    3.1set说明

    3.2TreeSet和HashSet

    3.3常用方法


    1.搜索树

    1.1概念

    二叉搜索树又称二叉排序树,它或者是一棵空树,或者具有以下性质:

    1> 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
    2> 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
    3> 它的左右子树也分别为二叉搜索树


    1.2查找

    1. public class BinarySearchTree {
    2. static class TreeNode {
    3. public int val;
    4. public TreeNode left;
    5. public TreeNode right;
    6. public TreeNode(int val) {
    7. this.val = val;
    8. }
    9. }
    10. public TreeNode root;//根结点
    11. public TreeNode search(int val) {
    12. TreeNode cur = root;
    13. while (cur != null) {
    14. if (cur.val < val) {
    15. cur = cur.right;
    16. } else if (cur.val > val) {
    17. cur = cur.left;
    18. } else {
    19. return cur;
    20. }
    21. }
    22. return null;
    23. }
    24. }

    1.3插入

    从根节点开始,比根结点小向左走,比根结点大向右走,直到达到叶子结点,插入该叶子结点。

    1. public boolean insert(int key) {
    2. TreeNode node = new TreeNode(key);
    3. //第一次插入
    4. if (root == null) {
    5. root = node;
    6. return true;
    7. }
    8. //之后的插入
    9. TreeNode cur = root;
    10. TreeNode parent = null;//用来记录cur的位置
    11. while (cur != null) {
    12. if (cur.val < key) {
    13. parent = cur;
    14. cur = cur.right;
    15. } else if (cur.val > key) {
    16. parent = cur;
    17. cur = cur.left;
    18. }else { //相同数据不能插入
    19. return false;
    20. }
    21. }
    22. if (parent.val > key) {
    23. parent.left = node;
    24. }else {
    25. parent.right = node;
    26. }
    27. return true;
    28. }

    1.4删除

    方法:替罪羊删除法

    找到左树的最右边,即左树最大值,或找到右树的最左边,即右树的最小值 作为替罪羊。

    1. /**
    2. * @param cur 要删除的结点
    3. * @param parent 要删除节点的父节点
    4. */
    5. private void remove(TreeNode cur, TreeNode parent) {
    6. if(cur.left == null) { //1.cur的左树为空
    7. if(cur == root) {
    8. root = cur.right;
    9. }else if(cur == parent.left) {
    10. parent.left = cur.right;
    11. }else {
    12. parent.right = cur.right;
    13. }
    14. }else if(cur.right == null) { //2.cur的右树为空
    15. if(cur == root) {
    16. root = cur.left;
    17. }else if(cur == parent.left) {
    18. parent.left = cur.left;
    19. }else {
    20. parent.right = cur.left;
    21. }
    22. }else { //3.cur的左右树都不为空
    23. //方法:替罪羊删除法
    24. //找右树的最小值,即右树的最左边作为替罪羊
    25. TreeNode targetParent = cur;
    26. TreeNode target = cur.right;
    27. while (target.left != null) { //直到左树为空,说明已经找到了替罪羊
    28. targetParent = target;
    29. target = target.left;
    30. }
    31. cur.val = target.val; //覆盖
    32. //回到了上面的情况1和情况2
    33. if(target == targetParent.left) {
    34. targetParent.left = target.right;
    35. }else {
    36. targetParent.right = target.right;
    37. }
    38. }
    39. }

    Set中存储key,Map中存储Key-value键值对

    2.Map

    2.1map说明

    Map官方文档Map (Java Platform SE 8 )

    注意:

    1.Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或HashMap

    2.Map中存放键值对的Key是唯一的,value是可重复的

    3.在TreeMap中插入键值对时,key不能为空,否则会抛出NullPointerException异常,value可以为空。但HashMap的key和value都可以为空;
    4. Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复);
    5. Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)。
    6. Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入。

    2.2TreeMap和HashMap

    MapTreeMapHashMap
    底层结构红黑树哈希桶
    增删查改复杂度O(logN)O(1)
    是否有序关于key有序无序
    是否线程安全不安全不安全
    增删查改区别需要进行元素比较通过哈希函数计算哈希地址
    比较与覆写key必须可比较,否则会抛出ClassCastException异常自定义类型需要覆写equals和hashCode方法
    应用场景需要在key有序场景下key是否有序不关心,需要更高的时间性能

    2.3常用方法

    方法说明
    V get (Object key )返回key对应的value
    V getOrDefault (Object key, V defaultValue)返回key对应的value, key不存在返回默认值
    V put (K key, V value)设置key对应的value
    V remove (Object key)删除key对应的映射关系
    Set keySet ()

    返回所有 key 的不重复集合

    Collection values ()返回所有 value 的可重复集合
    Set> entrySet ()返回所有的 key-value 映射关系
    boolean containsKey (Object key)判断是否包含 key
    boolean containsValues (Object value)判断是否包含 value

    3.Set

    3.1set说明

    Set官方文档Set (Java Platform SE 8 )

    注意:

    1. Set是继承自Collection的一个接口类;
    2. Set中只存储key,并且要求key一定要唯一
    3. TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的;
    4. Set最大的功能就是对集合中的元素进行去重
    5. 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础上维护了一个双向链表来记录元素的插入次序;
    6. Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入;
    7. TreeSet中不能插入null的key,HashSet可以。

    3.2TreeSet和HashSet

    类TreeMap和HashMap:

    Set底层结构TreeSetHashSet
    底层结构红黑树哈希桶
    增删查改时间复杂度O(logN)O(1)
    是否有序关于key有序不一定有序
    线程安全不安全不安全
    增删查改区别按照红黑树的特性进行插入和删除先计算key哈希地址,再进行插入和删除
    比较与覆写key必须可比较,否则会抛出ClassCastException异常自定义类型需要覆写equals和hashCode方法
    应用场景需要在key有序场景下key是否有序不关心,需要更高的时间性能

    3.3常用方法

    方法说明
    boolean add ( E e )添加元素,但重复元素不会被添加成功
    void clear ()清空集合
    boolean contains ( Object o )判断 o 是否在集合中
    Iterator iterator ()返回迭代器
    boolean remove ( Object o )删除集合中的 o
    int size ()返回 set 中元素的个数
    boolean isEmpty ()检测 set 是否为空
    Object [] toArray ()将 set 中的元素转换为数组返回
    boolean containsAll ( Collection c )判断集合 c 中的元素是否在 set 中全部存在
    boolean addAll ( Collection c )将集合c中的元素添加到 set 中,达到去重效果
  • 相关阅读:
    华为机试 HJ36 字符串加密【Java实现】
    笙默考试管理系统-MyExamTest----codemirror(34)
    SpringBoot如何集成Log模块呢?
    【BurpSuite】插件开发学习之J2EEScan(下)-主动扫描
    面试官:说一下红锁RedLock的实现原理?
    今年阿里云双十一服务器优惠价格讨论_看看大家怎么说?
    基于node.js自动写入版本号解决前端vue或webpack项目因分包发版引起的报错问题
    预言机链上链下调研
    深入理解蓝牙BLE之“扩展广播”
    RFID数字图书馆管理系统
  • 原文地址:https://blog.csdn.net/qq_74455045/article/details/131952659