Java 【数据结构】 TreeSet&TreeMap(二叉搜索树详解)【神装】

2024-06-04 3375阅读

Java 【数据结构】 TreeSet&TreeMap(二叉搜索树详解)【神装】 第1张

Java 【数据结构】 TreeSet&TreeMap(二叉搜索树详解)【神装】 第2张

登神长阶

 第八神装 TreeSet

   第九神装  TreeMap


目录

💉 一.二叉搜索树

🩸1. 定义

💊2. 基本操作

🩹3. 插入操作

🩼4. 查找操作

🩺5. 删除操作*

🩻6. 遍历操作

🪒7.性能分析

🪥二.TreeSet

🧽1. 定义

🧻 2.操作

🪣3. Set主要特性

🫧4. TreeSet的内部实现

🛒5. 应用场景

🧯三.TreeMap

🧹1.定义

🪤2.操作

🧷3.Map的主要特性

🧿4. TreeMap的内部实现

🪬5.应用场景 

🗿四.总结与反思


💉 一.二叉搜索树

首先我们要知道TreeSet/TreeMap底层都采用的都是一种二叉搜索树(也叫自平衡二叉树),因此我们先来了解一下二叉搜索树。

对于他的学习若之前没有了解的可以参考:Java 【数据结构】 二叉树(Binary_Tree)【神装】

🩸1. 定义

二叉搜索树(Binary Search Tree,简称BST),是一种特殊的二叉树,它具有以下性质:

  • 每个节点都有一个键(Key)和两个指向其他节点的指针(左子指针和右子指针)。
  • 任意节点的左子树中的所有键都小于该节点的键。
  • 任意节点的右子树中的所有键都大于该节点的键。
  • 左右子树也都是二叉搜索树。
  • 不存在键值相等的节点。

    Java 【数据结构】 TreeSet&TreeMap(二叉搜索树详解)【神装】 第3张

    在Java中,我们可以这样定义一个二叉搜索树:

    public class BinarySearchTree {
        private class Node {
            int val;
            Node left;
            Node right;
            
            Node(int val) {
                this.val = val;
                left = null;
                right = null;
            }
        }
        
        private Node root;
        
        // 构造函数、插入方法、查找方法、删除方法等...
    }
    

    💊2. 基本操作

    二叉搜索树支持以下基本操作:

    • 插入(Insert):向树中插入一个新节点,保持树的二叉搜索性质。
    • 查找(Search):在树中查找一个特定的节点。
    • 删除(Delete):从树中删除一个节点,并保持树的二叉搜索性质。
    • 遍历(Traverse):对树进行遍历,常用的遍历方式有前序、中序和后序遍历。

      接下来我们详细介绍一下它的各个操作,因为后续二叉树本身是数据结构中一个很关键的知识点,像红黑树,AVL树等等,我们需要牢牢掌握!

      🩹3. 插入操作

      插入操作的步骤如下:

      1. 创建新节点。
      2. 比较新节点的键与根节点的键:
        • 如果新节点的键小于根节点的键,则将新节点插入到根节点的左子树中。
        • 如果新节点的键大于根节点的键,则将新节点插入到根节点的右子树中。
      3. 如果插入点是空,则直接在新位置插入新节点。
      4. 如果插入点非空,则递归地在相应子树中进行插入操作。

      Java 【数据结构】 TreeSet&TreeMap(二叉搜索树详解)【神装】 第4张

      代码: 

       /**
           * 插入一个元素
           * @param key
           */
          public void insert(int key) {
              TreeNode node=new TreeNode(key);
              //若该搜索树为空,则直接作为根节点;
              if (root==null){
                  root=node;
              }
              TreeNode cur=root;
              TreeNode parent=null;
              while(cur!=null){
                  if (cur.keykey){
                      parent = cur;
                      cur=cur.left;
                  }else{
                      return ;
                  }
              }
              if (parent.key>key){
                  parent.left=node;
              }else{
                  parent.right=node;
              }
          }

      🩼4. 查找操作

      查找操作的步骤如下:

      1. 从根节点开始比较。
      2. 如果查找的键小于当前节点的键,则递归地在左子树中查找。
      3. 如果查找的键大于当前节点的键,则递归地在右子树中查找。
      4. 如果找到节点,则返回该节点。
      5. 如果没有找到,则返回null。

      Java 【数据结构】 TreeSet&TreeMap(二叉搜索树详解)【神装】 第5张

      代码

       //查找key是否存在
          public TreeNode search(int key) {
              TreeNode cur =root;
              while(cur!=null){
                  if (cur.keykey){
                      cur=cur.left;
                  }else{
                      return cur;
                  }
              }
              return null;
          }

      🩺5. 删除操作*

      设待删除结点为 cur, 待删除结点的双亲结点为 parent 1. cur.left == null
      1. cur 是 root,则 root = cur.right
      2. cur 不是 root,cur 是 parent.left,则 parent.left = cur.right
      3. cur 不是 root,cur 是 parent.right,则 parent.right = cur.right
      2. cur.right == null
      1. cur 是 root,则 root = cur.left
      2. cur 不是 root,cur 是 parent.left,则 parent.left = cur.left
      3. cur 不是 root,cur 是 parent.right,则 parent.right = cur.left
      3. cur.left != null && cur.right != null
      • 需要使用替换法进行删除,即在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点中,再来处理该结点的删除问题

        代码

        //删除key的值
            public boolean remove(int key) {
                TreeNode cur =root;
                TreeNode parent=null;
                while(cur!=null){
                    if (cur.key>key){
                        parent=cur;
                        cur=cur.left;
                    }else if (cur.key

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]