目录

1、什么是二叉搜索树?

2、手动模拟二叉搜索树

2.1、整体代码

2.2、查找数据

2.3、插入数据

2.4、删除数据

3、性能分析


1、什么是二叉搜索树?

二叉搜索树也叫作二叉排序树,可以使一颗空树,也可以是具有以下性质的二叉树:

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

举例:


2、手动模拟二叉搜索树

2.1、整体代码


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;/*** 查找key是否存在于二叉搜索树当中* @param key* @return 当前节点找到返回地址,否则返回null*/public TreeNode search(int key) {}/*** 插入节点* @param key*/public boolean insert(int key) {}/*** 删除节点* @param key*/public void remove(int key) {}
}

2.2、查找数据

代码:

      /*** 查找key是否存在于二叉搜索树当中* @param key* @return 当前节点找到返回地址,否则返回null*/public TreeNode search(int key) {TreeNode cur = root;while(cur != null) {if(cur.val > key) {cur = cur.left;} else if(cur.val < key) {cur = cur.right;} else {return cur;}}return null;}

2.3、插入数据

  • 树为空,直接插入
  • 树不为空,按照查找逻辑确定插入位置,如下:

代码:

   /*** 插入节点* @param key*/public boolean insert(int key) {TreeNode node = new TreeNode(key);if(root == null) {root = node;return true;}TreeNode cur = root;TreeNode parent = null;while (cur != null) {if(cur.val < key) {parent = cur;cur = cur.right;} else if(cur.val > key) {parent = cur;cur = cur.left;} else {//相等,搜索树中,无法存放值相等的节点return false;}}//cur == nullif(key > parent.val) {parent.right = node;} else {parent.left = node;}return true;}

2.4、删除数据

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

代码: 

    /*** 删除节点* @param key*/public void remove(int key) {TreeNode cur = root;TreeNode parent = null;while (cur != null) {if(cur.val < key) {parent = cur;cur = cur.right;} else if(cur.val > key) {cur = cur.left;} else {//该节点需要删除//1、cur.left == nullif(cur.left == null) {if(cur == root) {root = cur.right;} else if(cur == parent.left) {parent.left = cur.right;} else {parent.right = cur.right;}}//2、cur.right = nullelse if(cur.right == null) {if(cur == root) {root = cur.left;} else if(cur == parent.left) {parent.left = cur.left;} else {parent.right = cur.left;}}//3、cur.left != null && cur.right != nullelse {TreeNode targetParent = cur;TreeNode target = cur.right;//替换时,可以找左子树的最大值,也可以是右子树的最小值//我这里是,左子树的最大值while (target.left != null) {targetParent = target;target = target.left;}cur.val = target.val;if(targetParent.left == target) {targetParent.left = target.right;} else {targetParent.right = target.right;}}}}}

3、性能分析

  • 插入操作和删除操作都会必须先查找,查找效率代表了二叉搜索树中各个操作的性能
  • 在二叉搜索树中,如果每个元素查找的概率相等,则二叉搜索树平均查找的长度是结点在二叉搜索树的深度的函数,即节点越多,比较的次数越多
  • 对于同一个关键码集合,若插入次序不同,就可能会得到结构不同的二叉搜索树,如下:

这时,最优情况下,二叉搜索树为完全二叉树,平均比较次数为logN

最差情况下,二叉搜索树退化为单支树,平均比较次数为N/2

好啦,我们下期见咯~~~【AVL树】

二叉平衡树之二叉树搜索树【咱们一起手动模拟实现】相关推荐

  1. 二叉树--二叉平衡树

    二叉平衡树是二叉树中最为最要的概念之一,也是在语言库或者项目中应用比较广泛的一种特殊的树形结构. 二叉平衡树 AVL树是高度平衡的而二叉树.它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. ...

  2. 入门二叉平衡树的世界

    入门二叉平衡树的世界 1. 二叉平衡树的概念     二叉平衡树又称AVL树,它或者是一棵空二叉树,或者是具有下列性质的二叉树: 1) 根的左右子树高度之差的绝对值不超过1: 2) 根的左右子树都是二 ...

  3. 数据结构-树和二叉树(六)二叉平衡树

    本文详细介绍了二叉平衡树的定义.平衡二叉树的插入调整以及查找效率分析! Let's go!

  4. 数据结构源码笔记(C语言):二叉平衡树的相关操作算法

    //二叉平衡树的相关运算 #include<stdio.h> #include<malloc.h> #include<string.h>typedef char I ...

  5. 【数据结构进阶】二叉平衡树

    一. 二叉平衡树 概念 二叉搜索树有称 二叉排序树,它也可以是一个空树. 如果它的左子树不为空,则左子树上所有结点的值都小于根结点的值 如果他的右子树不为空,则右子树上所有结点的值都大于根结点的值 它 ...

  6. C语言实现二叉平衡树

    [前置知识]二叉树和二叉排序树 目录 1.什么是AVL树 2.怎么平衡 前言 对于大量的数据而言,链表的线性访问时间太慢,不宜使用.本章节将会介绍一种简单的数据结构:树(tree),其大部分操作的运行 ...

  7. 二叉平衡树(C++)

    背景: 二叉平衡树,就是根据二叉搜索树进行优化,让其速度更加的快,如果读者没有学过二叉搜索树,可以前往以下链接查看资料: http://t.csdn.cn/Sjjjshttp://t.csdn.cn/ ...

  8. C++判断一棵树是否为AVL(二叉平衡树)

    1. 题目要求 判断一棵二叉树是否是平衡二叉树 2. 思路 AVL树的名字来源于它的发明作者G.M. Adelson-Velsky 和 E.M. Landis.AVL树是最先发明的自平衡二叉查找树(S ...

  9. 数据结构与算法——二叉平衡树(AVL树)详解

    文章目录 AVL树概念 不平衡概况 四种平衡旋转方式 RR平衡旋转(左单旋转) LL平衡旋转(右单旋转) RL平衡旋转(先右后左双旋转) LR平衡旋转(先左后右单旋转) java代码实现 总结 AVL ...

最新文章

  1. java核心技术读书笔记1
  2. 3D游戏的照明设计理论,第4部分:如何在游戏引擎中照亮游戏世界
  3. r-studio扫描后各种颜色_iPhone手机备忘录,原来还隐藏着扫描仪,你不会还不知道吧?...
  4. 特征工程之特征选择_特征工程与特征选择
  5. [css] height和line-height的区别是什么呢?
  6. MySQL吉连_Learn Jdbc : Java, Jdbc, Odbc
  7. 如何利用bat在同一个IE用多个选项卡的方式打开多个网址? 如何利用bat在同一个IE用多个选项卡的方式打开多个网址? 我的网址是这样的http://www.xags.gov.cn:8003/gga
  8. 常见数据结构List之LinkedList
  9. uva 10562 Undraw the Trees
  10. 比Redis快50倍的中间件,为啥这么快?
  11. 新手android中ListView实现音乐列表
  12. 【数据分析面试】大厂高频SQL笔试题(二)
  13. kindle导出电子书pc_使用Kindle for PC预览和购买电子书
  14. 如何长久维持远距离恋情?
  15. STM32学习记录0010——TFTLCD液晶显示屏
  16. win10更新后耳机没有声音的解决方式
  17. 中证500-小盘股预警2015.4.2
  18. 计算机二级考试python+C语言通过记录
  19. 详述 Spring MVC 启动流程及相关源码分析
  20. 电脑怎么录制屏幕?分享电脑录制屏幕的3个方法

热门文章

  1. css3制作广告栏效果的疑问? 1
  2. JS 点击气泡卡片自身外的区域自动关闭的代码逻辑
  3. 北京 | 微信小程序及小游戏开发者线下交流会
  4. java 中 Native.loadLibrary 不能加载 jar 包中库文件的解决方案
  5. Android 高德地图的开发
  6. IT工具【日常随手记】
  7. 苹果编程语言Swift解析:将推动应用开发巨变
  8. Maix Bit K210人脸识别(内有获取机器码步骤)【保姆级教程】
  9. 定时打开指定程序软件
  10. 微信这个设置你们关闭了吗?