欢迎光临散文网 会员登陆 & 注册

11.4二叉排序树

2022-01-15 17:03 作者:取悦疾风  | 我要投稿

内容来自尚硅谷Java数据结构与java算法(Java数据结构与算法)_哔哩哔哩_bilibili

写在前面:本文内容大致和原视频内老师的笔记内容相同,会偶尔插入自己的注释和理解,尽量会完成作业

本次作业已完成,理解了之后就很简单

11.4二叉排序树

11.4.1先看一个需求

给你一个数列(7,3,10,12,5,1,9),要求能够高效的完成对数据的查询和添加

11.4.2解决方案分析

使用数组

数组未排序,优点:直接在数组尾添加,速度快。缺点:查找速度慢.[示意图]

数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢。[示意图]

使用链式存储-链表

不管链表是否有序,查找速度都慢,添加数据速度比数组快,不需要数据整体移动。[示意图]

使用二叉排序树

11.4.3二叉排序树介绍

二叉排序树:BST:(BinarySort(Search)Tree)。对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小右子节点的值比当前节点的值大

特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点

比如针对前面的数据(7,3,10,12,5,1,9),对应的二叉排序树为:

11.4.4二叉排序树的创建和遍历

一个数组创建成对应的二叉排序树,并使用中序遍历二叉排序树,比如:数组为Array(7,3,10,12,5,1,9),创建成对应的二叉排序树为∶

二叉排序树的删除情况比较复杂,有下面三种情况需要考虑

1.      删除叶子节点(比如: 2,5,9,12)

2.      删除只有一颗子树的节点(比如:1)

3.      删除有两颗子树的节点.(比如:7,3,10)

4.      操作的思路分析

//对删除节点的不同情况的分析

第一种情况:

删除叶子节点(比如:2,5,9,12)

思路

(1)需求先去找到要删除的结点targetNode

(2)找到targetNode的父结点parent

(3)确定targetNode是parent的左子结点还是右子结点

(4)根据前面的情况来对应册除

左子结点parent.left = null

右子结点parent.right = null;

第二种情况:册删除只有一颗子树的节点比如1

思路

(1)需求先去找到要删除的结点targetNode

(2)找到targetNode的父结点parent

(3)确定targetNode的子结点是左子结点还是右子结点

(4)targetNode是parent的左子结点还是右子结点

(5)如果targetNode有左子结点

5.1如果targetNode是parent 的左子结点

parent.left = targetNode.left;

5.2如果targetNode是parent的右子结点

parent.right = targetNode.left;

(6)如果targetNode有右子结点

6.1如果targetNode是 parent的左子结点

parent.left = targetNode.right;

6.2如果targetNode是 parent的石子结点

parent.right = targetNode.right

情况三:删除有两颗子树的节点.(比如:7,3,10 )

思路

(1)需求先去找到要删除的结点targetNode

(2)找到targetNode的父结点 parent

(3)从targetNode 的右子树找到最小的结点

(4)用一个临时变量,将最小结点的值保存temp = 11

(5)删除该最小结点

(6)targetNode.value = temp

11.4.6二叉排序树删除节点的代码实现

11.4.7课后练习:完成老师代码,并使用第二种方式解决

如果我们从左子树找到最大的节点,然后按照前面的思路完成


11.4二叉排序树的评论 (共 条)

分享到微博请遵守国家法律