二叉平衡树之二叉树搜索树【咱们一起手动模拟实现】
目录
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、删除数据
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树】
二叉平衡树之二叉树搜索树【咱们一起手动模拟实现】相关推荐
- 二叉树--二叉平衡树
二叉平衡树是二叉树中最为最要的概念之一,也是在语言库或者项目中应用比较广泛的一种特殊的树形结构. 二叉平衡树 AVL树是高度平衡的而二叉树.它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. ...
- 入门二叉平衡树的世界
入门二叉平衡树的世界 1. 二叉平衡树的概念 二叉平衡树又称AVL树,它或者是一棵空二叉树,或者是具有下列性质的二叉树: 1) 根的左右子树高度之差的绝对值不超过1: 2) 根的左右子树都是二 ...
- 数据结构-树和二叉树(六)二叉平衡树
本文详细介绍了二叉平衡树的定义.平衡二叉树的插入调整以及查找效率分析! Let's go!
- 数据结构源码笔记(C语言):二叉平衡树的相关操作算法
//二叉平衡树的相关运算 #include<stdio.h> #include<malloc.h> #include<string.h>typedef char I ...
- 【数据结构进阶】二叉平衡树
一. 二叉平衡树 概念 二叉搜索树有称 二叉排序树,它也可以是一个空树. 如果它的左子树不为空,则左子树上所有结点的值都小于根结点的值 如果他的右子树不为空,则右子树上所有结点的值都大于根结点的值 它 ...
- C语言实现二叉平衡树
[前置知识]二叉树和二叉排序树 目录 1.什么是AVL树 2.怎么平衡 前言 对于大量的数据而言,链表的线性访问时间太慢,不宜使用.本章节将会介绍一种简单的数据结构:树(tree),其大部分操作的运行 ...
- 二叉平衡树(C++)
背景: 二叉平衡树,就是根据二叉搜索树进行优化,让其速度更加的快,如果读者没有学过二叉搜索树,可以前往以下链接查看资料: http://t.csdn.cn/Sjjjshttp://t.csdn.cn/ ...
- C++判断一棵树是否为AVL(二叉平衡树)
1. 题目要求 判断一棵二叉树是否是平衡二叉树 2. 思路 AVL树的名字来源于它的发明作者G.M. Adelson-Velsky 和 E.M. Landis.AVL树是最先发明的自平衡二叉查找树(S ...
- 数据结构与算法——二叉平衡树(AVL树)详解
文章目录 AVL树概念 不平衡概况 四种平衡旋转方式 RR平衡旋转(左单旋转) LL平衡旋转(右单旋转) RL平衡旋转(先右后左双旋转) LR平衡旋转(先左后右单旋转) java代码实现 总结 AVL ...
最新文章
- java核心技术读书笔记1
- 3D游戏的照明设计理论,第4部分:如何在游戏引擎中照亮游戏世界
- r-studio扫描后各种颜色_iPhone手机备忘录,原来还隐藏着扫描仪,你不会还不知道吧?...
- 特征工程之特征选择_特征工程与特征选择
- [css] height和line-height的区别是什么呢?
- MySQL吉连_Learn Jdbc : Java, Jdbc, Odbc
- 如何利用bat在同一个IE用多个选项卡的方式打开多个网址? 如何利用bat在同一个IE用多个选项卡的方式打开多个网址? 我的网址是这样的http://www.xags.gov.cn:8003/gga
- 常见数据结构List之LinkedList
- uva 10562 	Undraw the Trees
- 比Redis快50倍的中间件,为啥这么快?
- 新手android中ListView实现音乐列表
- 【数据分析面试】大厂高频SQL笔试题(二)
- kindle导出电子书pc_使用Kindle for PC预览和购买电子书
- 如何长久维持远距离恋情?
- STM32学习记录0010——TFTLCD液晶显示屏
- win10更新后耳机没有声音的解决方式
- 中证500-小盘股预警2015.4.2
- 计算机二级考试python+C语言通过记录
- 详述 Spring MVC 启动流程及相关源码分析
- 电脑怎么录制屏幕?分享电脑录制屏幕的3个方法