二叉排序树
二叉排序树(BST): 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。如果有相同的值,可以将该节点放在左子节点或者右子节点。
数据[7,3,10,12,5,1,9] 对应的二叉排序树为:
- 若左子树非空,则左子树上所有结点的值均小于根结点的值。
- 若右子树非空,则右子树上所有结点的值均大于根结点的值。
- 左、右子树本身是二叉排序树。
二叉排序树的构建:
思路:
- 输入的值与根节点比较,若小于根节点则判断左子树是否为空,为空则直接放入,不为空则向下递归。
- 若大于根节点,判断右子树是否为空…
public void add(Nodes node){
// 参数为空,直接返回。
if (node == null)
return;
// 如果要添加的值小于根值,放在左边。
if (node.value < this.value){
//如果左指针为空,直接放入。
if (this.left == null)
this.left = node;
else
//如果左指针不为空,向左递归插入
this.left.add(node);
}else
if (this.right == null)
this.right = node;
else
this.right.add(node);
}
二叉排序树的删除:
二叉排序树的删除情况比较复杂,有三种情况需要考虑:
-
删除叶子节点
-
需要先找到要删除的节点 targetNode
-
找到targetNode 的父节点 parent
-
确定targetNode 是 parent的左子节点,还是右子节点
-
根据前面的情况来删除
左子节点 parent.left = null
右子节点 parent.right = null
-
-
删除只有一棵子树的节点
-
先去找到要删除的节点targetNode
-
找到要删除节点的父节点
-
确定targentNode的子节点 是左子节点还是右子节点
-
targenNode 是parent的左子节点还是右子节点
-
如果targentNode 有左子节点
- 如果targetNode是parent 的左子节点parent.left = targentNode.left。
- 如果targetNode 是 parent 的右子节点 parent.right = targentNode.left
-
如果targentNode是右子节点。
- 如果targetNode是parent 的左子节点parent.left = targentNode.right。
- 如果targetNode 是 parent 的右子节点 parent.right = targentNode.right。
-
-
删除有两颗子树的节点
- 需要先找到要删除的节点 targetNode
- 找到 targentNode 的父节点 parent
- 从targetNode 的右子树找到最小的节点
- 用临时变量,将最小节点的值保存 temp
- 删除最小节点。
- targetNode.value = temp
当我们删除 30 节点的时候,整个中序遍历的结果中,从 32 开始都往前移动了一位。32 是 30 的后继节点,就是比 30 大的节点中最小的节点。当某个节点存在右节点时,后继结点就是右节点中的最小值。