数据结构树-->二叉查找树\二叉排序树
目录
1. 数据结构树–>树基础
2. 数据结构树–>二叉树
3. 数据结构树–>二叉查找树\二叉排序树
4. 数据结构树–>平衡二叉树
5. 数据结构树–>霍夫曼树
6. 数据结构树–>红黑树
7. 数据结构树–>二叉堆
8. 数据结构树–>B树
9. 数据结构树–>B+树
二叉查找树\二叉排序树
二叉查找树是一种有序的二叉树,也叫儿叉排序树,它在二叉树的基础上添加了位置排序的规则。
规则: 每颗子树的根节点值比左子树大,比右子树小。
二叉查找树的缺点: 二叉查找树有了排序,但当我们的数据顺序与大小规律一致是就会发现,二叉查找树基本退化为了链表,导致达不到二叉
查找树快速查找的目的。
后续我们在介绍平衡二叉树的时候会解决之一问题。
1. 二叉查找树的查找
更具儿叉查找树的特性二叉查找树查找元素快速简单,快速:二叉查找树查找基本就是二分查找,所以快速。
2. 二叉查找树的插入
首先二叉查找树新插入的节点必定是新叶子节点。
如图,节点6并不会插入到节点5与节点7之间,而是插入到节点5的右孩子节点,新的节点是新叶子节点。
3. 二叉查找树的删除
二叉查找树的删除就有点复杂了,删除节点会破坏二叉查找树的结构,我们删除完节点后需要恢复该结构,在充分理解了二叉树的特性后你又能很容易的理解。
需要理解的特性:每颗子树的根节点的值比左子树大,比右子树小。
- 根据特性1,我们能推倒出每颗子树可以一直向左查找,查到叶子节点就是该子树的最小值,一直向右查找,查到叶子节点就是该子树的最大值。
二叉查找树的删除分三种情况:
- 删除的节点是叶子节点。
- 删除的节点只有一个子树。
- 删除的节点有两个子树。
3.1 删除的节点是叶子节点
这个很简单,我们了解叶子节点的特性,叶子节点可以直接删除不会破坏查找树的结构。
3.2 删除的节点只有一个子树
我们了解的二叉查找树的特性,如果一个节点只有一个子树,那么这个子树不管是左子树还是右子树,这个子树直接赋值到该节点的父节点上也是不会破坏
查找树的结构的。
如图删除节点4,根据二叉查找树排序的特性我们知道节点4的子树相对于它的父节点的排序与结构特性也是符合的,所以我们就可以将节点4的子树直接按照
节点4相对于节点4的父节点的左右区分赋值给节点4的父节点。也就是节点4属于父节点的左子树,删除节点4,节点4的子树赋值给父节点的左子树。
节点4属于父节点的右子树,子树就赋值给父节点的右子树,不用区分子树是属于节点4的左子树还是右子树。
3.3 删除的节点有两个子树
如图当我们要删除节点3的时候就会破坏二叉查找树的结构,我们删除后需要恢复该节点的结构。怎么恢复呢?需要确认那个节点来代替节点3的位置,如果使用右子树根节点5
来代替那节点4就需要动,使用左子树同样会出现这个问题。
我们了解二叉查找树的特性,每颗子树的根节点大于所有左子树,小于所有右子树,我们需要在左右子树中找出符合这个特性的节点来替代节点3,这个替代过程也要简单无需移动
太多。符合这个要求的节点我们根据二叉查找树的特性就能找到,最好的节点就是要删除的节点3的左子树最大值,右子树的最小值,也就是左子树的最右叶子节点,右子树的最左
叶子节点。我们通常使用的是右子树的最左节点(最小值)来替代节点3。
3.4 java 代码实现
public static void delete(BinaryTreeNode root, int key) {BinaryTreeNode father = root;BinaryTreeNode delete = null;//delete节点属于father的那个方向boolean left = true;while (father != null) {if (father.getKey() < key) {if (father.getRight() != null && father.getRight().getKey() == key) {delete = father.getRight();left = false;break;} else {father = father.getRight();}} else {if (father.getLeft() != null && father.getLeft().getKey() == key) {delete = father.getLeft();left = true;break;} else {father = father.getLeft();}}}if (father != null) {System.out.println("father key=" + father.getKey() + " delete key=" + delete.getKey());BinaryTreeNode l = delete.getLeft();BinaryTreeNode r = delete.getRight();if (l == null && r == null) {//删除的节点是叶子节点if (left) {father.setLeft(null);} else {father.setRight(null);}} else if (l == null || r == null) {//删除的节点只有一个子树if (left) {if (l == null) {father.setLeft(delete.getRight());} else {father.setLeft(delete.getLeft());}} else {if (l == null) {father.setRight(delete.getRight());} else {father.setRight(delete.getLeft());}}} else {//删除的节点有两个子树//找到右子树的最小值BinaryTreeNode tempFather = delete;BinaryTreeNode min = null;Stack<BinaryTreeNode> temps = new Stack<>();temps.add(tempFather);tempFather = tempFather.getRight();while (true) {temps.push(tempFather);if (tempFather.getLeft() == null) {break;} else {tempFather = tempFather.getLeft();}}min = temps.pop();tempFather = temps.pop();if (left) {father.setLeft(min);} else {father.setRight(min);}if (temps.size() > 0) {//这个判断 tempFather 不是为delete节点 如果最小值有右子树则赋值右子树。if (min.getRight() != null) {tempFather.setLeft(min.getRight());}min.setLeft(delete.getLeft());min.setRight(delete.getRight());} else {if (min.getRight() != null) {tempFather.setRight(min.getRight());}min.setLeft(delete.getLeft());}}}}
数据结构树-->二叉查找树\二叉排序树相关推荐
- 数据结构树、二叉树、完全二叉树、二叉查找树、平衡二叉树、红黑树、B+树
树.二叉树.平衡二叉树.二叉搜索树 树的前序遍历.中序遍历和后序遍历 树的前序遍历.中序遍历和后续遍历是以遍历时根所在的位置顺序命名的.层次遍历即按层从上至下,从左至右遍历即可. 前序遍历:根-> ...
- [转]C#与数据结构--树论--平衡二叉树(AVL Tree)
C#与数据结构--树论--平衡二叉树(AVL Tree) http://www.cnblogs.com/abatei/archive/2008/11/17/1335031.html 介绍 我们知道在二 ...
- 数据结构:二叉查找树(C语言实现)
数据结构:二叉查找树 二叉查找树 基础知识 关于二叉树的基础知识,请看我的一篇博客:二叉树的链式存储 二叉查找树的特征 二叉查找树或者是一棵空树,或者是具有下列性质的二叉树: 1.若其左子树不空,则左 ...
- python数据结构-树
树 树是数据元素之间具有层次关系的非线性结构,由n个节点构成的有限集合,节点数为0的树叫空树 树: 有且仅有一个被称为根的节点 其余节点可分为m个互不相交的有限集合,每个集合又构成一棵树,叫做根节点的 ...
- 数据结构-树与深度优先遍历
笔者在读书时,选择的专业是计算机科学,但和大家一样,在处理线性的问题时较为熟悉,但当自己在尝试理解树和图这种非线性结构时,就总无法深刻准确的理解,为此,也很苦恼很无奈,但也没有什么好的办法.这次趁着 ...
- java二叉排序树_数据结构与算法—二叉排序树(java)
前言 前面介绍学习的大多是线性表相关的内容,把指针搞懂后其实也没有什么难度.规则相对是简单的. 再数据结构中树.图才是数据结构标志性产物,(线性表大多都现成api可以使用),因为树的难度相比线性表大一 ...
- 数据结构树-->B树
目录 1. 数据结构树–>树基础 2. 数据结构树–>二叉树 3. 数据结构树–>二叉查找树\二叉排序树 4. 数据结构树–>平衡二叉树 5. 数据结构树–>霍夫曼树 6 ...
- 走进数据结构 - 树(Tree)的世界
前言: 树是各种数据结构中最重头戏的结构.树的各种分类及其子类的各种特征,也是在算法研究和实践中最有价值的学问.本人基于自己的学识和见闻,打算写一篇树的前世今生和树的大家族的介绍,由于 ...
- 数据结构树-->霍夫曼树
目录 1. 数据结构树–>树基础 2. 数据结构树–>二叉树 3. 数据结构树–>二叉查找树\二叉排序树 4. 数据结构树–>平衡二叉树 5. 数据结构树–>霍夫曼树 6 ...
最新文章
- 浅析Spring——控制反转IoC
- 【转】Kconfig,Makefile 和 .config
- SIP协议学习2-pjsip
- STM32工作笔记0027---理解电阻的串联和并联
- 南阳oj a+b问题
- Java 11 将至,不妨了解一下 Oracle JDK 之外的版本
- 实现两个虚拟域内用户相互收发邮件
- Linux学习笔记(二十三)shell介绍、history命令历史、命令补全和别名、通配符、...
- 为什么少有人在Windows电脑上安OS X?
- 《孙子兵法战场机变之军争篇》
- 360 度测试:Kafka 会丢数据么?其高可用是否满足需求?
- Vulnerabilities in multi-factor authentication:多因素身份验证漏洞
- 软考2022下半年上午题真题和知识点整理
- UVA11021 Tribles 概率
- 入网模组 | 广和通G510无线GPRS模块接入方案
- iris web框架无法加载静态文件
- AIX5.3上使用smit installp 安装Python 3.5.2
- Android拾遗——如何反编绎APK文件
- 蠡测机房重构之组合查询
- 构建高性能微服务架构(网易)
热门文章
- windows平台下的进程内存修改
- 推荐一系列优秀的Android开发源码(转自安卓巴士)
- JVM-Shenandoah GC-29
- (转载)二次剩余(知识总结+板子整理)
- 四年级计算机下册word教学设计,四年级下册信息技术《我的地盘我做主》教学设计...
- 罩形件冲压模具设计及制造(论文+CAD图纸)
- 【Vuejs】1146- 这些 Vue 的技巧你都掌握了吗?
- mybatis mapper-locations作用
- 關於基於WinCE下的聲音系統調試的一些經驗總結之驱动程式部分(二)
- 五原县扬帆志愿者协会开展“春节慰问送温暖,年味渐浓情更深”新春慰问活动