# 数据结构树--＞二叉查找树\二叉排序树

9 篇文章 2 订阅

## 二叉查找树\二叉排序树

### 3. 二叉查找树的删除

1. 据特性1，我们能推倒出每颗子树可以一直向左查找，查到叶子节点就是该子树的最小值，一直向右查找，查到叶子节点就是该子树的最大值。

1. 删除的节点是叶子节点。
2. 删除的节点只有一个子树。
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());
}

}
}
}

• 0
点赞
• 6
收藏
觉得还不错? 一键收藏
• 0
评论
09-08 7169
10-25 7367
06-08 1051
04-25 8万+
03-26
05-25 7028
01-13 2万+
04-03 849
10-27 3753
08-08 118

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。