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

在Java中实现二叉查找树的函数

发布时间:2023-06-25 04:15:32

二叉查找树(Binary Search Tree)是一种特殊的二叉树结构,它的每个节点包含一个比其左子树中任何节点都大、比其右子树中任何节点都小的值,因此也被称为二叉排序树。由于它的查找和插入操作时间复杂度均为O(logn),因此被广泛应用于数据结构中。

在Java中实现二叉查找树,我们需要定义一个节点类和一个二叉查找树类。节点类包含三个属性:节点值、左子节点和右子节点。二叉查找树类包含一个根节点和若干个插入、查找、删除等操作的方法。

节点类的实现如下:

class Node {
    public int value;
    public Node left;
    public Node right;

    public Node(int value) {
        this.value = value;
        left = null;
        right = null;
    }
}

二叉查找树类的实现如下:

class BinarySearchTree {
    public Node root;

    public BinarySearchTree() {
        root = null;
    }

    // 在树中插入一个节点
    public void insert(int value) {
        root = insert(root, value);
    }

    // 在子树中插入一个节点
    private Node insert(Node node, int value) {
        if (node == null) {
            return new Node(value);
        }
        if (value < node.value) {
            node.left = insert(node.left, value);
        } else {
            node.right = insert(node.right, value);
        }
        return node;
    }

    // 查找一个节点是否存在于树中
    public boolean search(int value) {
        return search(root, value);
    }

    // 在子树中查找一个节点
    private boolean search(Node node, int value) {
        if (node == null) {
            return false;
        }
        if (node.value == value) {
            return true;
        } else if (value < node.value) {
            return search(node.left, value);
        } else {
            return search(node.right, value);
        }
    }

    // 删除一个节点
    public void delete(int value) {
        root = delete(root, value);
    }

    // 在子树中删除一个节点
    private Node delete(Node node, int value) {
        if (node == null) {
            return null;
        }
        if (value == node.value) {
            if (node.left == null && node.right == null) {
                return null;
            } else if (node.left == null) {
                return node.right;
            } else if (node.right == null) {
                return node.left;
            } else {
                int minVal = findMin(node.right);
                node.value = minVal;
                node.right = delete(node.right, minVal);
                return node;
            }
        } else if (value < node.value) {
            node.left = delete(node.left, value);
            return node;
        } else {
            node.right = delete(node.right, value);
            return node;
        }
    }

    // 找到子树中最小的节点值
    private int findMin(Node node) {
        while (node.left != null) {
            node = node.left;
        }
        return node.value;
    }
}

其中,insert()方法用于向树中插入一个节点,它递归地调用insert()方法来在子树中寻找插入位置;search()方法用于查找树中是否存在某个节点,它也递归地调用search()方法来在子树中查找目标节点;delete()方法用于删除树中的一个节点,它递归地调用delete()方法来在子树中删除目标节点;findMin()方法用于找到子树中最小的节点,它在向右子树寻找最小值的过程中不断地向左移动。

总之,二叉查找树类的实现十分简单易懂,通过递归实现了插入、查找和删除等操作,这对于理解Java中的递归方法的实现方式和使用十分有帮助。