本文已参与「新人创作礼」活动,一起开启掘金创作之路。
二叉排序树
对数列 (7, 3, 10, 12, 5, 1, 9)操作,高效的完成对数据的查询和添加
分析:
使用数组:
-
数组未排序
- 优点:直接在数组尾添加,速度快
- 缺点:查找速度慢
-
数组排序
- 优点:可以使用二分查找,查找速度快
- 缺点:为了保证数组有序, 在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢
使用链表:
- 不管链表是否有序,查找速度都慢,添加数据速度比数组快,不需要数据整体 移动
使用二叉排序树:
基本介绍
-
二叉排序树:BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求==左子节点的值比当前节点的值小,右子节点的值比当前节点的值大==。
-
如果有相同的值,可以将该节点放在左子节点或右子节点
-
对数据(7, 3, 10, 12, 5, 1, 9)进行二叉排序树
二叉排序树创建与遍历
数组创建成一个二叉排序树,使用中序遍历二叉排序树。Array(7, 3, 10, 12, 5, 1, 9) 对此数组进行中序遍历二叉排序树
二叉排序树的删除(解析篇)
分析
-
删除叶子节点 (比如:2, 5, 9, 12)
-
即该节点下==没有==左右子节点
-
找到要删除的结点,targetNode
-
找到 targetNode 的父节点 parent
-
确定 targetNode 是parent 的左子结点,还是右子结点
-
更情况来对应删除
- 左子结点:parent . left = null
- 右子结点:parent . right = null
-
-
删除只有一颗子树的节点 (比如:1)
-
即该节点有左子节点==或==者右子节点
-
找到要删除的结点,targetNode
-
找到 targetNode 的父节点 parent
-
确定 targetNode 的子节点是左子结点还是右子结点
-
targetNode 是 parent 的左子结点还是右子结点
-
若targetNode 有左子结点
- targetNode 是 parent 的左子结点
- parent.left = targetNode.left
- targetNode 是 parent 的右子结点
- parent.right= targetNode.left
-
若targetNode 有右子结点
- targetNode 是 parent 的左子结点
- parent.left = targetNode.right
- targetNode 是 parent 的右子结点
- parent.right= targetNode.right
-
-
删除有两颗子树的节点. (比如:删除10 )
-
即该节点有左子节点==和==者右子节点
- 找到要删除的结点,targetNode
- 找到 targetNode 的父节点 parent
- 从 targetNode 的右子树找到最小的结点,保存在一个变量中 temp
- 删除最小结点
- targetNode.value = temp
-