1. 二叉排序树介绍
二叉排序树 BST:(Binary Sort(Search)Tree),对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。
特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点。
比如针对前面的数据(7,3,10,12,5,1,9),对应的二叉排序树为:
2. 二叉排序树的删除
二叉排序树的删除情况比较复杂,有下面的三种情况需要考虑
- 删除叶子节点(比如:2, 5, 9,12)
- 删除只有一颗子树的节点(比如:1)
- 删除有两颗子树的节点。(比如:7,3,10)
第一种情况:删除叶子节点
思路:
- 先去找到要删除的节点 targetNode
- 找到 targetNode 的父节点
- 确定 targetNode 是parent的左子节点,还是右子节点
- 若是左子节点,则 parent.left = null 若是右子节点,则 parent.right = null
第二种情况:删除只有一颗子树的节点
思路:
- 找到要删除的节点 targetNode
- 找到 targetNode 的父节点 parent
- 确定 targetNode 的子节点是左子节点还是右子节点
- taregetNode 是parent的左子节点还是右子节点
- 如果 targetNode 有左子节点
5.1 如果 targetNode 是 parent 的左子节点 – parent.left = targetNode.left
5.2 如果 targetNode 是 parent 的右子节点 – parent.right = targetNode.left- 如果 targetNode 有右子节点
6.1 如果 targetNode 是 parent 的左子节点 – parent.left = targetNode.right
6.2 如果 targetNode 是 parent 的右子节点 – parent.right = targetNode.right
第三种情况:删除有两颗子树的节点
思路:(以上图 7 节点 为例)
- 找到要删除的节点 targetNode
- 找到 targetNode 的父节点 parent
- 从 targetNode 的右子树找到最小的节点
- 用一个临时变量,将 最小节点的值保存至 temp = 12
- 删除该最小节点
targetNode.value = temp