当前位置: 首页 > news >正文

二叉搜索树(Java实现)

 博主主页: 码农派大星.

    数据结构专栏:Java数据结构

 数据库专栏:MySQL数据库

JavaEE专栏:JavaEE

关注博主带你了解更多数据结构知识

目录

1.概念

2.实现二叉搜索树

定义节点

查找元素

插入元素 

删除元素


1.概念

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

若它的左子树不为空,则左子树上所有节点的值都小于根节点的值

若它的右子树不为空,则右子树上所有节点的值都大于根节点的值

它的左右子树也分别为二叉搜索树

2.实现二叉搜索树

定义节点

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 seach(int key){TreeNode cur = root;while ( cur != null){  //根节点的值不等于要查找的key值,接下来循环if (cur.val < key){//根节点的值小于key值,让其在右子树继续查找cur = cur.right;}else if(cur.val > key){//根节点的值大于key值,让其在左子树继续查找cur = cur.left;}else {//找到了key值,返回即可return cur;}}return null;//树中没有要找的key值,直接返回null}

插入元素 

1.如果为空,那么直接插入
2.如果不为空,如果小于根则插入左边,大于则插入右边

 //插入public void insert(int val){TreeNode node = new TreeNode(val);if(root == null){root = node;return;}TreeNode cur = root;TreeNode parent = null;while (cur != null){if(cur.val < val){parent = cur;cur = cur.right;}else if(cur.val > val){parent = cur;cur = cur.left;}else {return;}}if(parent.val > val){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) {root = cur.right;}else if(cur == parent.left) {parent.left = cur.right;}else {parent.right = cur.right;}}else if(cur.right == null) {if(cur == root) {root = cur.left;}if(cur == parent.left) {parent.left = cur.left;}else {parent.right = cur.left;}}else {//cur.left!=null&&cur.right!=null,//那么就在cur的左边找到最大值,或者cur的右边找到最小值来替换该元素TreeNode target = cur.right;TreeNode targetP = cur;while (target.left != null) {targetP = target;target = target.left;}cur.val = target.val;if(target == targetP.left) {targetP.left = target.right;}else {targetP.right = target.right;}}}

性能分析:

插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。
对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。
最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:log_{2}N
​最差情况下,二叉搜索树退化为单支树,其平均比较次N数为:\frac{N}{2}


http://www.mrgr.cn/news/28701.html

相关文章:

  • 数字化转型企业架构设计手册(交付版),企业数字化转型建设思路、本质、数字化架构、数字化规划蓝图(PPT原件获取)
  • 单元测试、集成测试、系统测试、验收测试、压力测试、性能测试、安全性测试、兼容性测试、回归测试(超详细的分类介绍及教学)
  • 【Chapter 3】Machine Learning Classification Case_Prediction of diabetes-XGBoost
  • 第三十三篇——用变化的眼光看最大值和最小值
  • C#实现在windows上实现指定句柄窗口的指定窗口坐标点击鼠标左键和右键的详细情况
  • Redis哨兵(sentinel)
  • 鸿蒙开发入门day19-使用NDK接口构建UI(二)
  • MySQL之表内容的增删改查(含oracel 9i经典测试雇佣表下载)
  • 后门账号从入门到应急响应
  • 深入解析:高性能 SSE 服务器的设计与实现
  • C++笔记---二叉搜索树
  • Scratch植物大战僵尸【机器人vs外星人版本】
  • ego-planner开源代码之数据流分析
  • 分页 101012
  • 解决Visual Studio中OpenCV链接错误:LNK2019无法解析的外部符号
  • 卷积——入门理解
  • 基于jupyter notebook + joint-spider爬虫数据的成都二手房数据可视化分析项目源代码+详细使用说明
  • CMAT:提升小型语言模型的多智能体协作调优框架
  • git笔记
  • 什么是事件驱动
  • 【C/C++】程序的构建(编译)过程概述
  • 【笔记】枚举
  • BLE 协议之物理层
  • 【蜡笔小新专享】安装虚拟机、PHP、DVWA
  • 【解决方案】LIMS实验室管理系统功能需求及建设方案(Word)
  • 卸载Linux 内核 以及NVIDIA驱动