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

使用Java实现数据结构中的二叉查找树

发布时间:2023-05-30 05:17:49

二叉查找树(Binary Search Tree,BST)是一种数据结构,它是一颗二叉树,并且对于任何一个节点,它的左子树中的所有节点的键值小于该节点的键值,该节点的右子树中的所有节点的键值大于该节点的键值。

二叉查找树主要用于实现动态集合的操作,包括插入、删除和查找操作。在本文中,我们将使用Java语言来实现这些操作。

首先,我们定义一个节点类Node,其中包含节点的键值key以及左右子节点left和right:

class Node {
    int key;
    Node left, right;

    Node(int item) {
        key = item;
        left = right = null;
    }
}

接下来,我们定义一个二叉查找树类BST,其中包含插入、删除和查找操作:

class BST {
    Node root;

    void insert(int key) {
        root = insertRecursive(root, key);
    }

    private Node insertRecursive(Node current, int key) {
        if (current == null) {
            return new Node(key);
        }

        if (key < current.key) {
            current.left = insertRecursive(current.left, key);
        } else if (key > current.key) {
            current.right = insertRecursive(current.right, key);
        } else {
            // key already exists
            return current;
        }

        return current;
    }

    void delete(int key) {
        root = deleteRecursive(root, key);
    }

    private Node deleteRecursive(Node current, int key) {
        if (current == null) {
            return null;
        }

        if (key == current.key) {
            // node to delete found
            if (current.left == null && current.right == null) {
                // node is a leaf
                return null;
            }
            if (current.right == null) {
                // node has one child (left)
                return current.left;
            }
            if (current.left == null) {
                // node has one child (right)
                return current.right;
            }
            // node has two children
            int smallestValue = findSmallestValue(current.right);
            current.key = smallestValue;
            current.right = deleteRecursive(current.right, smallestValue);
            return current;
        }
        if (key < current.key) {
            current.left = deleteRecursive(current.left, key);
            return current;
        }
        current.right = deleteRecursive(current.right, key);
        return current;
    }

    private int findSmallestValue(Node root) {
        return root.left == null ? root.key : findSmallestValue(root.left);
    }

    boolean contains(int key) {
        return containsRecursive(root, key);
    }

    private boolean containsRecursive(Node current, int key) {
        if (current == null) {
            return false;
        }
        if (key == current.key) {
            return true;
        }
        return key < current.key
          ? containsRecursive(current.left, key)
          : containsRecursive(current.right, key);
    }
}

在上面的代码中,insert操作用于将给定的key插入到二叉查找树中,delete操作用于删除给定的key,contains操作用于检查给定的key是否存在于二叉查找树中。这些操作都是递归实现的。

最后,我们可以使用二叉查找树类来操作数据。例如:

public static void main(String[] args) {
    BST bst = new BST();

    bst.insert(6);
    bst.insert(4);
    bst.insert(8);
    bst.insert(3);
    bst.insert(5);
    bst.insert(7);
    bst.insert(9);

    System.out.println(bst.contains(5)); // true
    System.out.println(bst.contains(2)); // false

    bst.delete(4);

    System.out.println(bst.contains(4)); // false
}

这段代码创建了一个Binary Search Tree并插入了一些节点,然后检查了某些节点是否存在于二叉查找树中,最后删除了一个节点。

这就是如何使用Java实现二叉查找树。由于该代码是递归实现的,因此可能存在栈溢出的风险,需要谨慎使用。