二叉搜索树Java实现(查找、插入、删除、遍历)

Java实现二叉搜索树完整项目解析 在本章中,我们深入分析了BST的插入与查找操作,包括递归与非递归实现方式,并对它们的性能进行了比较。通过封装辅助方法和引入异常处理机制,提高了代码的可维护性和健壮性。下一章我们将继续深入BST的核心操作:删除节点,分析其三种情况及实现策略。AVL树是一种自平衡二叉搜索树,通过旋转操作维持树的高度平衡。其核心特性是:任意节点的左右子树高度差不超过1。AVL树的插入操作如下:elsereturn x;y.left = x; 阅读详情


原文:https://www.cnblogs.com/Michaelwjw/p/6384428.html


由于最近想要阅读下 JDK1.8 中 HashMap 的具体实现,但是由于 HashMap 的实现中用到了红黑树,所以我觉得有必要先复习下红黑树的相关知识,所以写下这篇随笔备忘,有不对的地方请指出~

  学习红黑树,我觉得有必要从二叉搜索树开始学起,本篇随笔就主要介绍 Java 实现二叉搜索树的查找、插入、删除、遍历等内容。

  二叉搜索树需满足以下四个条件:

  1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  3. 任意节点的左、右子树也分别为二叉查找树;
  4. 没有键值相等的节点。

  二叉搜索树举例:

  

                         图一

  接下来将基于图一介绍二叉搜索树相关操作。

 

  首先,应先有一个节点对象相关的类,命名为 Node。

  

复制代码
 1 class Node {
 2     int key;
 3     int value;
 4     Node leftChild;
 5     Node rightChild;
 6 
 7     public Node(int key, int value) {
 8         this.key = key;
 9         this.value = value;
10     }
11 
12     public void displayNode() {
13 
14     }
15 }

复制代码

  Node 类中包含 key 值,用于确定节点在树中相应位置,value 值代表要存储的内容,还含有指向左右孩子节点的两个引用。

  接下来看下搜索树相应的类:

  

复制代码
 1 class Tree {
 2     Node root;//保存树的根
 3 
 4     public Node find(int key) {//查找指定节点
 5         
 6     }
 7 
 8     public void insert(int key, int value) {//插入节点
 9        
10     }
11 
12     public boolean delete(int key) {//删除指定节点
13         
14     }
15 
16     private Node getDirectPostNode(Node delNode) {//得到待删除节点的直接后继节点
17         
18     }
19 
20     public void preOrder(Node rootNode) {//先序遍历树
21        
22     }
23 
24     public void inOrder(Node rootNode) {//中序遍历树
25         
26     }
27 
28     public void postOrder(Node rootNode) {//后序遍历树
29         
30     }
31 }
复制代码

   类中表示树的框架,包含查找、插入、遍历、删除相应方法,其中删除节点操作最为复杂,接下来一一介绍。

  一、查找某个节点

    由于二叉搜索树定义上的特殊性,只需根据输入的 key 值从根开始进行比较,若小于根的 key 值,则与根的左子树比较,大于根的key值与根的右子树比较,以此类推,找到则返回相应节点,否则返回 null。

复制代码
 1 public Node find(int key) {
 2         Node currentNode = root;
 3         while (currentNode != null && currentNode.key != key) {
 4             if (key < currentNode.key) {
 5                 currentNode = currentNode.leftChild;
 6             } else {
 7                 currentNode = currentNode.rightChild;
 8             }
 9         }
10         return currentNode;
11 }
复制代码

   二、插入节点

    与查找操作相似,由于二叉搜索树的特殊性,待插入的节点也需要从根节点开始进行比较,小于根节点则与根节点左子树比较,反之则与右子树比较,直到左子树为空或右子树为空,则插入到相应为空的位置,在比较的过程中要注意保存父节点的信息 及 待插入的位置是父节点的左子树还是右子树,才能插入到正确的位置。

复制代码
 1 public void insert(int key, int value) {
 2         if (root == null) {
 3             root = new Node(key, value);
 4             return;
 5         }
 6         Node currentNode = root;
 7         Node parentNode = root;
 8         boolean isLeftChild = true;
 9         while (currentNode != null) {
10             parentNode = currentNode;
11             if (key < currentNode.key) {
12                 currentNode = currentNode.leftChild;
13                 isLeftChild = true;
14             } else {
15                 currentNode = currentNode.rightChild;
16                 isLeftChild = false;
17             }
18         }
19         Node newNode = new Node(key, value);
20         if (isLeftChild) {
21             parentNode.leftChild = newNode;
22         } else {
23             parentNode.rightChild = newNode;
24         }
25 }
复制代码

 

    三、遍历二叉搜索树

    遍历操作与遍历普通二叉树操作完全相同,不赘述。

复制代码
 1     public void preOrder(Node rootNode) {
 2         if (rootNode != null) {
 3             System.out.println(rootNode.key + " " + rootNode.value);
 4             preOrder(rootNode.leftChild);
 5             preOrder(rootNode.rightChild);
 6         }
 7     }
 8 
 9     public void inOrder(Node rootNode) {
10         if (rootNode != null) {
11             inOrder(rootNode.leftChild);
12             System.out.println(rootNode.key + " " + rootNode.value);
13             inOrder(rootNode.rightChild);
14         }
15     }
16 
17     public void postOrder(Node rootNode) {
18         if (rootNode != null) {
19             postOrder(rootNode.leftChild);
20             postOrder(rootNode.rightChild);
21             System.out.println(rootNode.key + " " + rootNode.value);
22         }
23     }
复制代码

 

    四、删除指定节点。

    在二叉搜索树中删除节点操作较复杂,可分为以下三种情况。

    1、待删除的节点为叶子节点,可直接删除。

复制代码
  public boolean delete(int key) {
        Node currentNode = root;//用来保存待删除节点
        Node parentNode = root;//用来保存待删除节点的父亲节点
        boolean isLeftChild = true;//用来确定待删除节点是父亲节点的左孩子还是右孩子
        while (currentNode != null && currentNode.key != key) {
            parentNode = currentNode;
            if (key < currentNode.key) {
                currentNode = currentNode.leftChild;
                isLeftChild = true;
            } else {
                currentNode = currentNode.rightChild;
                isLeftChild = false;
            }
        }
        if (currentNode == null) {
            return false;
        }
        if (currentNode.leftChild == null && currentNode.rightChild == null) {//要删除的节点为叶子节点
            if (currentNode == root)
                root = null;
            else if (isLeftChild)
                parentNode.leftChild = null;
            else
                parentNode.rightChild = null;
        } 
        ......
    
    }
复制代码

  

    2、待删除节点只有一个孩子节点

    例如删除图一中的 key 值为 11 的节点,只需将 key 值为 13 的节点的左孩子指向 key 值为 12的节点即可达到删除 key 值为 11 的节点的目的。

    由以上分析可得代码如下(接上述 delete 方法省略号后):

复制代码
 1         else if (currentNode.rightChild == null) {//要删除的节点只有左孩子
 2             if (currentNode == root)
 3                 root = currentNode.leftChild;
 4             else if (isLeftChild)
 5                 parentNode.leftChild = currentNode.leftChild;
 6             else
 7                 parentNode.rightChild = currentNode.leftChild;
 8         } else if (currentNode.leftChild == null) {//要删除的节点只有右孩子
 9             if (currentNode == root)
10                 root = currentNode.rightChild;
11             else if (isLeftChild)
12                 parentNode.leftChild = currentNode.rightChild;
13             else
14                 parentNode.rightChild = currentNode.rightChild;
15         } 
......
复制代码

 

    3、待删除节点既有左孩子,又有右孩子。

    例如删除图一中 key 值为 10 的节点,这时就需要用 key 值为 10 的节点的中序后继节点(节点 11)来代替 key 值为 10 的节点,并删除 key 值为 10 的节点的中序后继节点,由中序遍历相关规则可知, key 值为 10 的节点的直接中序后继节点一定是其右子树中 key 值最小的节点,所以此中序后继节点一定不含子节点或者只含有一个右孩子,删除此中序后继节点就属于上述 1,2 所述情况。图一中 key 值为 10 的节点的直接中序后继节点 为 11,节点 11 含有一个右孩子 12。

    所以删除 图一中 key 值为 10 的节点分为以下几步:

    a、找到 key 值为 10 的节点的直接中序后继节点(即其右子树中值最小的节点 11),并删除此直接中序后继节点。

复制代码
 1  private Node getDirectPostNode(Node delNode) {//方法作用为得到待删除节点的直接后继节点
 2         
 3         Node parentNode = delNode;//用来保存待删除节点的直接后继节点的父亲节点
 4         Node direcrPostNode = delNode;//用来保存待删除节点的直接后继节点
 5         Node currentNode = delNode.rightChild;
 6         while (currentNode != null) {
 7             parentNode = direcrPostNode;
 8             direcrPostNode = currentNode;
 9             currentNode = currentNode.leftChild;
10         }
11         if (direcrPostNode != delNode.rightChild) {//从树中删除此直接后继节点
12             parentNode.leftChild = direcrPostNode.rightChild;
13             direcrPostNode.rightChild = null;
14         }
15         return direcrPostNode;//返回此直接后继节点
16         
17 }
复制代码

    b、将此后继节点的 key、value 值赋给待删除节点的 key,value值。(接情况二中省略号代码之后)

复制代码
1 else { //要删除的节点既有左孩子又有右孩子
2 
3             //思路:用待删除节点右子树中的key值最小节点的值来替代要删除的节点的值,然后删除右子树中key值最小的节点
4             //右子树key最小的节点一定不含左子树,所以删除这个key最小的节点一定是属于叶子节点或者只有右子树的节点
5             Node directPostNode = getDirectPostNode(currentNode);
6             currentNode.key = directPostNode.key;
7             currentNode.value = directPostNode.value;
8 
9 }
复制代码

 

  至此删除指定节点的操作结束。

  最后给出完整代码及简单测试代码及测试结果:

  

复制代码
  1 class Node {
  2     int key;
  3     int value;
  4     Node leftChild;
  5     Node rightChild;
  6 
  7     public Node(int key, int value) {
  8         this.key = key;
  9         this.value = value;
 10     }
 11 
 12     public void displayNode() {
 13 
 14     }
 15 }
 16 
 17 class Tree {
 18     Node root;
 19 
 20     public Node find(int key) {
 21         Node currentNode = root;
 22         while (currentNode != null && currentNode.key != key) {
 23             if (key < currentNode.key) {
 24                 currentNode = currentNode.leftChild;
 25             } else {
 26                 currentNode = currentNode.rightChild;
 27             }
 28         }
 29         return currentNode;
 30     }
 31 
 32     public void insert(int key, int value) {
 33         if (root == null) {
 34             root = new Node(key, value);
 35             return;
 36         }
 37         Node currentNode = root;
 38         Node parentNode = root;
 39         boolean isLeftChild = true;
 40         while (currentNode != null) {
 41             parentNode = currentNode;
 42             if (key < currentNode.key) {
 43                 currentNode = currentNode.leftChild;
 44                 isLeftChild = true;
 45             } else {
 46                 currentNode = currentNode.rightChild;
 47                 isLeftChild = false;
 48             }
 49         }
 50         Node newNode = new Node(key, value);
 51         if (isLeftChild) {
 52             parentNode.leftChild = newNode;
 53         } else {
 54             parentNode.rightChild = newNode;
 55         }
 56     }
 57 
 58     public boolean delete(int key) {
 59         Node currentNode = root;
 60         Node parentNode = root;
 61         boolean isLeftChild = true;
 62         while (currentNode != null && currentNode.key != key) {
 63             parentNode = currentNode;
 64             if (key < currentNode.key) {
 65                 currentNode = currentNode.leftChild;
 66                 isLeftChild = true;
 67             } else {
 68                 currentNode = currentNode.rightChild;
 69                 isLeftChild = false;
 70             }
 71         }
 72         if (currentNode == null) {
 73             return false;
 74         }
 75         if (currentNode.leftChild == null && currentNode.rightChild == null) {
 76             //要删除的节点为叶子节点
 77             if (currentNode == root)
 78                 root = null;
 79             else if (isLeftChild)
 80                 parentNode.leftChild = null;
 81             else
 82                 parentNode.rightChild = null;
 83         } else if (currentNode.rightChild == null) {//要删除的节点只有左孩子
 84             if (currentNode == root)
 85                 root = currentNode.leftChild;
 86             else if (isLeftChild)
 87                 parentNode.leftChild = currentNode.leftChild;
 88             else
 89                 parentNode.rightChild = currentNode.leftChild;
 90         } else if (currentNode.leftChild == null) {//要删除的节点只有右孩子
 91             if (currentNode == root)
 92                 root = currentNode.rightChild;
 93             else if (isLeftChild)
 94                 parentNode.leftChild = currentNode.rightChild;
 95             else
 96                 parentNode.rightChild = currentNode.rightChild;
 97         } else { //要删除的节点既有左孩子又有右孩子
 98             //思路:用待删除节点右子树中的key值最小节点的值来替代要删除的节点的值,然后删除右子树中key值最小的节点
 99             //右子树key最小的节点一定不含左子树,所以删除这个key最小的节点一定是属于叶子节点或者只有右子树的节点
100             Node directPostNode = getDirectPostNode(currentNode);
101             currentNode.key = directPostNode.key;
102             currentNode.value = directPostNode.value;
103         }
104         return true;
105     }
106 
107     private Node getDirectPostNode(Node delNode) {//方法作用为得到待删除节点的直接后继节点
108 
109         Node parentNode = delNode;//用来保存待删除节点的直接后继节点的父亲节点
110         Node direcrPostNode = delNode;//用来保存待删除节点的直接后继节点
111         Node currentNode = delNode.rightChild;
112         while (currentNode != null) {
113             parentNode = direcrPostNode;
114             direcrPostNode = currentNode;
115             currentNode = currentNode.leftChild;
116         }
117         if (direcrPostNode != delNode.rightChild) {//从树中删除此直接后继节点
118             parentNode.leftChild = direcrPostNode.rightChild;
119             direcrPostNode.rightChild = null;
120         }
121         return direcrPostNode;//返回此直接后继节点
122 
123     }
124 
125     public void preOrder(Node rootNode) {
126         if (rootNode != null) {
127             System.out.println(rootNode.key + " " + rootNode.value);
128             preOrder(rootNode.leftChild);
129             preOrder(rootNode.rightChild);
130         }
131     }
132 
133     public void inOrder(Node rootNode) {
134         if (rootNode != null) {
135             inOrder(rootNode.leftChild);
136             System.out.println("key: " + rootNode.key + " " + "value: " + rootNode.value);
137             inOrder(rootNode.rightChild);
138         }
139     }
140 
141     public void postOrder(Node rootNode) {
142         if (rootNode != null) {
143             postOrder(rootNode.leftChild);
144             postOrder(rootNode.rightChild);
145             System.out.println(rootNode.key + " " + rootNode.value);
146         }
147     }
    
      private void destroy(Node tree) {
           if (tree==null)
               return ;
 
           if (tree.left != null)
               destroy(tree.leftChild);
           if (tree.right != null)
               destroy(tree.rightChild);
 
          tree=null;
      }
    
    public void destory() {
      destory(root);
    }
148 } 
149 public class BinarySearchTreeApp {
150   public static void main(String[] args) {
151       Tree tree = new Tree();
152     tree.insert(6, 6);//插入操作,构造图一所示的二叉树

153     tree.insert(3, 3);

154     tree.insert(14, 14);

155     tree.insert(16, 16);

156     tree.insert(10, 10);

157     tree.insert(9, 9);

158     tree.insert(13, 13);

159     tree.insert(11, 11);

160     tree.insert(12, 12);

161 162   System.out.println("删除前遍历结果");

163     tree.inOrder(tree.root);//中序遍历操作

164 165   System.out.println("删除节点10之后遍历结果");

166     tree.delete(10);//删除操作

167     tree.inOrder(tree.root); 168
    }

169 }
复制代码

    测试结果:

    

    



MCP4728 电路及stm32F103程序移植 写在前面 通过优快云查到一些MCP4728 的程序,结合程序及datasheet对于驱动的描述,理清了思路 感谢开路者! MCP4728的电路比较简单,见下文描述 应用电路 datasheet: 实际测试电路: SCL接stm32的PB10,SDA接PB11 RDY/BSY引脚和LDCA引脚,悬空 解释见截图: MCP4728地址 选择任意输出通道写入DAC输入寄存器 应用程序 int mcp4728_write_all_channel(float vol1, float vol2, fl 阅读详情

相关推荐

从URDF到Gazebo:一个完整的ROS2机械臂仿真项目实战与避坑指南

本文提供了一个完整的ROS2机械臂仿真项目实战指南,详细讲解了从URDF建模、ROS2 Control配置、MoveIt2集成到Gazebo仿真的全流程。文章重点分享了URDF惯性参数设置、Gazebo插件选择、MoveIt2配置修正等关键步骤的避坑经验,帮助开发者快速搭建可用的六轴机械臂仿真环境,实现从静态模型到物理仿真的跨越。

weixin_29279153的博客 273

【数据结构】树与二叉树(十六):二叉树的基础操作:插入结点(算法Insert)

本文介绍了二叉树的基础操作——插入结点(左插入、右插入),包括ADL语言、时间复杂度分析及C语言实现

天地玄黄 魑魅魍魉 风花雪月 商角徵羽 1832

CRISPR筛选全流程指南:从文库构建到数据分析实战

功能基因组学研究需要高效解析基因型与表型的关联,高通量筛选技术是其中的关键工具。基于CRISPR系统的筛选方法通过大规模sgRNA文库扰动基因功能,结合慢病毒递送和测序分析,能够系统鉴定影响细胞增殖、耐药、病毒感染的候选基因。与RNAi或化学小分子筛选相比,CRISPR筛选具有覆盖全基因组、脱靶率低、信号清晰等优势,已广泛应用于药物靶点发现、合成致死和免疫治疗机制研究。本文围绕实验设计与操作中的核心要点展开,涵盖文库扩增、病毒滴度控制、MOI把握、筛选模式选择以及基于MAGeCK的sgRNA丰度分析,并针对

weixin_31188927的博客 280

二叉树(二叉树的建立,插入,删除,遍历)

二叉树的基础。概念,插入,删除,建立,遍历

y江江江江的博客 949

【JS】自定义上传组件,文件上传与回显,自定义进度条显示(基于element-plus与axios)

公司是做B 端产品的,有sass平台也有源码交付的项目,最近开发了很多小系统,这里记录一下开发遇到的问题。 需要定制一个上传组件,要求可以自定义文件存储路径,自定义可上传的文件类型,限制文件大小等,并且提供基础的文件回显功能,例如上传一张图片到服务器指定目录的`/file`文件夹下面,并且实现可以查看预览的功能。

余浩的博客 1161

告别裸奔MCU!手把手教你用MCP2515+STM32搭建稳定CAN总线通信(附完整代码)

本文详细介绍了如何使用MCP2515与STM32搭建稳定可靠的CAN总线通信系统,适用于汽车电子和工业控制领域。通过硬件架构设计、驱动层实现、数据收发实战及故障排查手册,帮助开发者快速掌握CAN通信技术,提升系统稳定性和开发效率。

weixin_28703489的博客 208

数据结构——平衡二叉树(AVL树)之插入

文章目录前言一.定义二.基本操作1.查找,删除2.插入(如何调整)如何调整代码实现插入 前言 首先我们来思考一下一个普通二叉树保存数据,如果想查找一个数据,由于普通二叉树保存数据是随机的,要找到数据的时间复杂度为O(n)。后面为了方便 ,我们又学习二叉搜索树,它的定义是将比根节点小的数放左边,比根节点大的数放右边,并且每一课子树都是二叉搜索树这样使得数据在树上存储有一定 的规律,在一定情况下查找起来很方便。但是,二叉搜索数当给出数据的顺序不同时,二叉搜索树也会不同。比如如果给出的序列为{1,2,3,4,5}

weixin_57023347的博客 8503

Windows下用RKDevTool解包update.img的完整流程(含常见错误排查)

本文详细介绍了在Windows系统下使用RKDevTool工具解包update.img固件的完整流程。从工具准备、环境搭建到逐步解包操作,重点解析了输出文件结构,并提供了修改分区后重新打包的实战方法。文章还针对解包失败、打包错误等常见问题提供了详细的排查与解决方案,旨在帮助嵌入式开发者和爱好者高效完成固件分析与定制工作。

aa123的博客 715

二叉树的插入与删除

排序规则:定义一个vector数组,将数组中的第一个值作为根节点,此后将后面的值与根节点的值比较,如果小于根节点的值,则放在根节点的左边,如果大于根节点的值,放在根的右边。以此类推,根节点的左子树(右子树)又是一棵二叉树。此外,在二叉树排序中不允许出现两个相同的值。当二叉树完成之后,可以用中序遍历的方式将它从小到达排序。 定义结构体BstNode和BSTree分别定义了它们的属性和根节点,这里会增加一个双亲指针,它可以让我们的子节点指向它的父节点,但是这样也会降低它的存储密度。即原来12个字节中可以存储

wu___hao的博客 5436

【OpenClaw从入门到精通】第20篇:OpenClaw实战—从零搭建教育自动化助教系统(作业批改+智能答疑+学情分析)【2026实测】

本文基于OpenClaw开源框架,聚焦教育行业“答疑重复、批改耗时、学情模糊”三大核心痛点,提供从环境部署到功能落地的全流程实操方案。通过整合QQ群交互、代码分析、数据可视化等技能,构建“智能答疑+作业批改+学情分析”的自动化助教系统。系统支持7×24小时群聊答疑、多语言作业自动评审、学情数据周报生成,经实测可使助教工作时间减少60%、作业批改效率提升5-10倍、学情问题识别提前5周。文中包含完整配置步骤、可直接运行的代码示例及避坑指南,兼顾新手入门与进阶实操,帮助教育工作者快速落地自动化工具,从重复劳动中

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1448

Unity Hololens2开发|(一)环境配置

开发过程中预览和调试应用:可以在电脑上的 Unity 编辑器中以播放模式本地运行应用,并将体验流式传输到 HoloLens2。将来自 HoloLens2 的输入(视线、手势、语音和空间映射)发送到电脑,在其中内容以虚拟沉浸式视图渲染。在HoloLens2设备中,打开Settings面板,依次选择Update & Security > For Developers,打开“Developer Mode”。在开发计算机中打开控制面板,依次选择“更新和安全> 开发者选项”,打开“开发人员模式”;

游戏开发小Y的博客 14万+

二叉树的插入、查找、删除

给定一个二叉查找树: 树结点的定义: public class Tree { public int data; //左孩子 public Tree lchild; //右孩子 public Tree rchild; } 通过下面的方法对这个二叉树进行插入、查询、删除操作。 插入:     通过循环的方式对二叉树进行结点插入。 代码示例: public void insert(int value) { //当前节点 Tree curr

CodAlun的博客 5381

YOLOv11改进入门篇 | 手把手讲解改进模块如何实现高效涨点,以SimAM注意力模块为例

本文记录的是基于SimAM注意力模块的YOLOv11目标检测方法研究。SimAM注意力模块通过优化能量函数来获得每个神经元的三维权重,而或增加计算复杂度。若是有轻量化需求的小伙伴,无参的注意力模块也许是一个不错的选择。

Limiiiing的博客 9036

java 二叉排序树_二叉搜索树Java实现(查找、插入、删除、遍历)

由于最近想要阅读下 JDK1.8 中 HashMap 的具体实现,但是由于 HashMap 的实现中用到了红黑树,所以我觉得有必要先复习下红黑树的相关知识,所以写下这篇随笔备忘,有不对的地方请指出~学习红黑树,我觉得有必要从二叉搜索树开始学起,本篇随笔就主要介绍 Java 实现二叉搜索树的查找、插入、删除、遍历等内容。二叉搜索树需满足以下四个条件:若任意节点的左子树不空,则左子树上所有结点的值均小...

weixin_42502060的博客 285

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java二叉查找树遍历_Java 实现二叉搜索树的查找、插入、删除、遍历

由于最近想要阅读下JDK1.8 中HashMap的具体实现,但是由于HashMap的实现中用到了红黑树,所以我觉得有必要先复习下红黑树的相关知识,所以写下这篇随笔备忘,有不对的地方请指出~学习红黑树,我觉得有必要从二叉搜索树开始学起,本篇随笔就主要介绍Java实现二叉搜索树的查找、插入、删除、遍历等内容。二叉搜索树需满足以下四个条件:若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的...

weixin_32957761的博客 148

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

AI论文写作工具测评与高效写作方案

自然语言处理(NLP)技术正在重塑学术写作流程,通过智能文献分析、语法检查和内容生成等功能显著提升效率。以Semantic Scholar、ChatPDF为代表的工具能快速提取论文核心信息,Turnitin等系统则通过写作风格分析保障质量。这些AI写作工具特别适合面临选题困难、文献综述撰写障碍的本科生和研究生,在开题报告准备、英语论文写作等场景中能节省大量时间。实测显示,合理使用Paperpal、Writefull等工具可使写作效率提升60%,但需注意避免学术不端风险。建议将AI作为辅助工具,在保持学术诚信

weixin_34377919的博客 769

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

二叉搜索树的实现(包含插入、查找、遍历、删除等)【Java版】

package com.BinarySearchTree; import java.util.LinkedList; /** *实现二分搜索树 *O(logn) *适用于查找表(字典) //定义树的结点 private class Node { private Key key; //键,相当于字典中的单词 private Value v...

yulutian的博客 666

二叉树的插入、删除、修改、先序、中序、后序遍历

 由于最近想要阅读下 JDK1.8 中 HashMap 的具体实现,但是由于 HashMap 的实现中用到了红黑树,所以我觉得有必要先复习下红黑树的相关知识,所以写下这篇随笔备忘,有不对的地方请指出~  学习红黑树,我觉得有必要从二叉搜索树开始学起,本篇随笔就主要介绍 Java 实现二叉搜索树的查找、插入、删除、遍历等内容。  二叉搜索树需满足以下四个条件:若任意节点的左子树不空,则左子树上所有结...

yingz0123的博客 1万+

[剑指Offer学习] :二叉搜索树原理及Java实现

剑指Offer:二叉搜索树原理及Java实现

在互联网大海漂泊的一叶扁舟的博客 277

二叉搜索树的实现

二叉搜索树(BST) 二叉搜索树它是二叉树的一种类别,其节点按特定顺序排列。这也称为有序二叉树。 在二叉搜索树中,左子树中所有节点的值小于根的值。 类似地,右子树中所有节点的值大于或等于根的值。 此规则将递归地应用于根的所有左子树和右子树。 前序遍历:30,15,7,22,17,27,60,45,75 中序遍历: 7,15,17,22,27,30,45,60,75 后序遍历:7,17,27,22,15,45,75,60,30 二叉查找树的实现: API设计: 1.节点类: 2.二叉搜索树类: //

Linging_24的博客 370

二叉搜索树Java实现

二叉搜索树:对与树中任一节点x,其左子树的关键字小于等于x.key,其右子树的关键字大于等于x.key。二叉搜索树其常见操作的最坏时间复杂度度均为O(h),其中h为树的高度。用于实现linux进程管理和Java TreeMap的红黑树就是一种平衡二叉搜索树。 下面为二叉搜索树的Java实现(参考算法导论的伪代码) package Tree; import java.util.LinkedL

zfyseu1的专栏 340

算法系列之数据结构-二叉搜索树

二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。

修己xj的博客 1175

bst java_BST(二叉搜索树) Java 实现解析

1.二叉搜索树的定义:一颗树的所有左子树都比根小,所有右子树都比根大,成为二叉搜索树。2.该BST树实现了9个重要方法,分别是关键字查找,插入,删除,删除节点后续节点查找,前序遍历,中序遍历,后序遍历,获取最大节点,获取最小节点。3.以下是Java的代码实现://定义Node类,拥有元素值,节点名称,左孩子节点,右孩子节点,4个成员变量。class Node {int element;String...

weixin_30111277的博客 358

算法导论12章-二叉搜索树(Binary Search Trees)

这是我的第一篇 算法导论(Introduction to Algorithms, Third Edition) 读书笔记. 旨在记录重点, 强化自己对算法的学习效果. 这里不会像书本那样详细, 给出复杂的推理证明, 这里只是一点学习心得. 我看到是 算法导论(中文版) 的书, 这里有原著(提取码:cz4v)(英文版PDF) 可以对照阅读. 1 什么是二叉搜索树 一棵 二叉搜索树(BST) 是以一棵 二叉树 来组织的. 二叉搜索树 可以使用一个 链表数据结构(linked data structure ) 表

四年时光 930

二叉搜索树

import java.util.ArrayList; import java.util.LinkedList; import java.util.List; //树节点的封装类 class Node{ int age; String name; Node leftChild; Node rightChild; public Node(int age...

放荡不羁 200

二叉搜索树的插入、删除、查找等操作:Java语言实现

1 二叉搜索树介绍       二叉搜索树(BST, Binary Search Tree),也称二叉排序树或二叉查找树。二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:1. 非空左子树的所有键值小于其根结点的键值。2. 非空右子树的所有键值大于其根结点的键值。3. 左、右子树都是二叉搜索树。2 二叉搜索树的主要操作2.1 二叉搜索树的查找操作      查找从根结点开始,如果树为空,...

cqulun123的博客 2139
上一篇: 括号匹配算法的一种正确实现(java)
下一篇: 快速排序原理及java实现
还不够
博客等级 码龄16年 113粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值