二叉搜索树

embedded/2024/10/22 8:47:20/

一、概念

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

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

搜索效率高,一次能砍掉一半,最好的情况:O(logN),最坏的情况:O(N)

二、搜索

图解

代码实现

public class BinarySearchTree {static class TreeNode{public int val;public TreeNode left;public TreeNode right;public TreeNode(int val){this.val = val;}}public TreeNode root = null;public TreeNode search(int key){TreeNode cur = root;while(cur!=null){if(cur.val<key){cur = cur.right;}else if(cur.val>key){cur = cur.left;}else{return cur;}}return null;}}

三、插入 (只能插入叶子节点)

图解:

代码实现:

public class BinarySearchTree {static class TreeNode{public int val;public TreeNode left;public TreeNode right;public TreeNode(int val){this.val = val;}}public TreeNode root = null;//只能插入叶子节点public void insert(int key){TreeNode node = new TreeNode(key);if(root==null){root = node;return;}TreeNode cur = root;TreeNode parent = null;while(cur!=null){if(cur.val>key){parent = cur;cur = parent.left;}else if(cur.val<key){parent = cur;cur = parent.right;}else{return;//相同值不能插入}}if(parent.val>key){parent.left = node;}else{parent.right = node;}}}

四、删除

分三种情况

代码实现:

 public void remove(int key){TreeNode parent = null;TreeNode cur = root;while(cur!=null){if(cur.val<key){parent = cur;cur = cur.right;}else if(cur.val>key){parent = cur;cur = cur.left;}else{//找到要删除的节点removeNode(parent,cur);return;}}}private void removeNode(TreeNode parent,TreeNode cur){//三种情况//左树空if(cur.left==null){if(cur == root){cur = cur.right;}else if(cur == parent.left){parent.left = cur.right;}else{parent.right = cur.right;}}else if(cur.right == null){//右树空if(cur==root){cur = cur.left;}else if(cur == parent.left){parent.left = cur.left;}else{parent.right = cur.left;}}else{//都不为空TreeNode target = cur.right;//找右树TreeNode targetP = cur;while(target.left!=null){targetP = target;target = targetP.left;}cur.val = target.val;if(target==targetP.left){targetP.left = target.right;}else{targetP.right = target.right;}}}

五、性能分析

搜索的最优情况下是完全二叉树,时间复杂度O(logN)

最差情况下,二叉搜索树退化为单支树,时间复杂度O(N)

如果退化成单支树,二叉搜索树的性能就失去了。因此就需要解决高度平衡问题,就出现了AVL树。


http://www.ppmy.cn/embedded/33636.html

相关文章

工作问题记录React(持续更新中)

一、backdrop-filter:blur(20px); 毛玻璃效果&#xff0c;在安卓机上有兼容问题&#xff0c;添加兼容前缀也无效&#xff1b; 解决方案&#xff1a;让设计师调整渐变&#xff0c;不要使用该属性! 复制代码 background: radial-gradient(33% 33% at 100% 5%, #e9e5e5 0%, rgba…

大数据BI可视化(Echarts组件)项目开发-熟悉koa2后端开发6.0

koa2简介 1.基于Node.js平台的web开发框架 2.由Express原班人马打造 Express&#xff0c;koa&#xff0c;koa2 框架名作用异步处理Expressweb框架回调函数koaweb框架Generatoryieldkoa2web框架async/await 3.环境依赖Node.js V7.6.0以上 koa2特点 1.支持async/await 2.…

孩子如何学好python

学习基础知识&#xff1a;孩子可以从学习Python的基础知识开始&#xff0c;包括变量、数据类型、循环、条件语句等。可以通过在线教程、书籍或者视频课程进行学习。 实践编程&#xff1a;让孩子通过实际编写代码来巩固所学知识&#xff0c;可以让他们完成一些简单的编程项目或…

每日OJ题_DFS爆搜深搜回溯剪枝⑧_力扣980. 不同路径 III

目录 力扣980. 不同路径 III 解析代码 力扣980. 不同路径 III 980. 不同路径 III 难度 困难 在二维网格 grid 上&#xff0c;有 4 种类型的方格&#xff1a; 1 表示起始方格。且只有一个起始方格。2 表示结束方格&#xff0c;且只有一个结束方格。0 表示我们可以走过的空…

leetCode71. 简化路径

leetCode71. 简化路径 代码 // 化简&#xff1a;就是把所有的., .. // 去掉弄成进入想进的目录&#xff0c;且结果最后不能有/ // 实现思路&#xff1a; 本质上是一个栈&#xff0c;就是进栈出栈的一个模拟实现 class Solution { public:string simplifyPath(string path) {//…

基于 Dockerfile 部署 LNMP 架构

目录 前言 1、任务要求 2、Nginx 镜像创建 2.1 建立工作目录并上传相关安装包 2.2 编写 Nginx Dockerfile 脚本 2.3 准备 nginx.conf 配置文件 2.4 生成镜像 2.5 创建 Nginx 镜像的容器 2.6 验证nginx 3、Mysql 镜像创建 3.1 建立工作目录并上传相关安装包 3.2 编写…

SQL 基础 | JOIN 操作介绍

在SQL中&#xff0c;JOIN是一种强大的功能&#xff0c;用于将两个或多个表中的行结合起来&#xff0c;基于相关的列之间的关系。 JOIN操作通常用在SELECT语句中&#xff0c;以便从多个表中检索数据。 以下是几种基本的JOIN类型以及它们的用法&#xff1a; INNER JOIN&#xff1…

Web Storage 笔记12 操作购物车

相关内容&#xff1a;购物车实例 WebStorage存储空间足够大&#xff0c;访问都在客户端(Client)完成。有些客户端先处理或检查数据&#xff0c;就可以直接使用WebStorage进行存储&#xff0c;不仅可以提高访问速度&#xff0c;还可以降低服务器的练习。负担。例如&#xff0c;购…