欢迎访问宙启技术站
智能推送

Java函数实现二叉搜索树的查找、插入、删除

发布时间:2023-06-01 06:51:31

二叉搜索树也称二叉查找树或二叉排序树,是一种特殊的二叉树。在二叉搜索树中,任意节点的左子树上的所有节点的值均小于它,而右子树上的所有节点的值均大于它。同时,左子树和右子树也都是二叉搜索树。

在Java中,实现二叉搜索树的关键是定义节点类和树类。节点类需要存储节点的值以及左右子节点的引用,树类需要存储根节点的引用以及实现查找、插入、删除等基本操作。

1. 定义二叉搜索树节点类

定义节点类时要注意,需要存储节点的值,以及左右子节点的引用。节点类可以采用泛型,以便处理不同类型的值。

class TreeNode<T extends Comparable<T>> {
    T val;
    TreeNode<T> left;
    TreeNode<T> right;

    TreeNode(T val) {
        this.val = val;
        left = null;
        right = null;
    }
}

2. 定义二叉搜索树类

定义二叉搜索树类时,需要存储根节点的引用。树类中定义了查找、插入、删除等基本操作的函数。

class BinarySearchTree<T extends Comparable<T>> {
    private TreeNode<T> root;

    BinarySearchTree() {
        root = null;
    }

    // 查找操作
    public TreeNode<T> search(T val) {
        return search(root, val);
    }

    private TreeNode<T> search(TreeNode<T> root, T val) {
        if (root == null || root.val.compareTo(val) == 0) {
            return root;
        }
        if (root.val.compareTo(val) > 0) {
            return search(root.left, val);
        } else {
            return search(root.right, val);
        }
    }

    // 插入操作
    public void insert(T val) {
        root = insert(root, val);
    }

    private TreeNode<T> insert(TreeNode<T> root, T val) {
        if (root == null) {
            return new TreeNode(val);
        }
        if (root.val.compareTo(val) > 0) {
            root.left = insert(root.left, val);
        } else if (root.val.compareTo(val) < 0) {
            root.right = insert(root.right, val);
        }
        return root;
    }

    // 删除操作
    public void delete(T val) {
        root = delete(root, val);
    }

    private TreeNode<T> delete(TreeNode<T> root, T val) {
        if (root == null) {
            return null;
        }
        if (root.val.compareTo(val) > 0) {
            root.left = delete(root.left, val);
        } else if (root.val.compareTo(val) < 0) {
            root.right = delete(root.right, val);
        } else {
            // 删除的是叶子节点
            if (root.left == null && root.right == null) {
                root = null;
            }
            // 删除的节点只有一个子节点
            else if (root.left == null) {
                root = root.right;
            } else if (root.right == null) {
                root = root.left;
            }
            // 删除的节点有两个子节点
            else {
                TreeNode<T> node = findMin(root.right);
                root.val = node.val;
                root.right = delete(root.right, node.val);
            }
        }
        return root;
    }

    private TreeNode<T> findMin(TreeNode<T> root) {
        while (root.left != null) {
            root = root.left;
        }
        return root;
    }
}

3. 测试二叉搜索树类

定义完二叉搜索树类后,需要测试其功能是否正常。下面是一个示例程序,演示如何使用二叉搜索树类完成查找、插入、删除等操作。

public class TestBinarySearchTree {
    public static void main(String[] args) {
        BinarySearchTree<Integer> bst = new BinarySearchTree<Integer>();
        bst.insert(5);
        bst.insert(3);
        bst.insert(7);
        bst.insert(1);
        bst.insert(4);
        bst.insert(9);
        System.out.println(bst.search(3));
        System.out.println(bst.search(6));
        bst.delete(5);
        System.out.println(bst.search(5));
    }
}

运行结果如下所示:

TreeNode@15db9742
null
null

从运行结果可以看出,程序成功地执行了查找、插入、删除等操作,验证了我们所定义的二叉搜索树类的正确性。

综上所述,本文介绍了Java如何实现二叉搜索树的查找、插入、删除等基本操作。Java中的二叉搜索树类可以采用泛型,以便处理不同类型的值,可以方便地实现各类应用场景下的需求。