图解删除二叉排序树节点的三种情况:
第三种情况中,targetNode 右子树最小的节点刚好满足:大于左子树的所有结点 ,同时小于右子树其他剩余节点。类似的,左子树的最大结点也满足。下面代码取用找右子树的最小结点。
1、第一种情况:删除叶子结点
查找要删除的结点(Node类中):
查找要删除结点的父节点(Node类中):
这里写的时候出现的bug:其一是,判断当前节点是否是要删除的父节点时,第二个判断语句没有加括号,且this.right.value写成this.value
简单在BinarySortTree类中封装一下
删除节点:
1)删除叶子结点:
测试:
2)删除只有一个结点
因为删除只有一颗子树的结点的判定情况较复杂,所以放在
if 是叶子结点
else if 是有两颗子树的结点
else 只有一颗子树的结点
三段中的else 里面,
这思想叫做必然事件的子事件互斥,三种情况都会发生,除去两个,那第三个必定发生。
测试删除结点1.
3)删除有两颗子树的结点
先写一个方法:
再调用一下:
测试一下:
完整代码:
package com.huey.tree;
public class BinarySortTreeDemo {
public static void main(String[] args) {
int[] arr = {
7, 3, 10, 12, 5, 1, 9, 2 };
BinarySortTree binarySortTree = new BinarySortTree();
// 循环的添加结点到二叉排序树
for (int i = 0; i < arr.length; i++) {
binarySortTree.add(new Node(arr[i]));
}
// 中序遍历二叉排序树
System.out.println("中序遍历二叉排序树~");
binarySortTree.infixOrder();
// 测试删除叶子节点
binarySortTree.delNode(2);
binarySortTree.delNode(5);
binarySortTree.delNode(9);
binarySortTree.delNode(12);
binarySortTree.delNode(7);
binarySortTree<