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

Java中实现二叉搜索树的代码示例

发布时间:2023-06-21 04:12:13

二叉搜索树也叫二叉查找树,是一种特殊的二叉树,左子树上所有节点的值均小于它的根节点的值,右子树上所有节点的值均大于它的根节点的值,因此,每个节点都具有以下特征:

1.左子树上所有节点的值均小于它的根节点的值

2.右子树上所有节点的值均大于它的根节点的值

3.左右子树都是二叉搜索树

Java中实现二叉搜索树的代码示例

public class BinarySearchTree<E extends Comparable<E>> {

    private class Node {

        public E e;

        public Node left, right;

        public Node(E e) {

            this.e = e;

            left = null;

            right = null;

        }

    }

    private Node root;

    private int size;

    public BinarySearchTree() {

        root = null;

        size = 0;

    }

    public int size() {

        return size;

    }

    public boolean isEmpty() {

        return size == 0;

    }

    // 向二分搜索树中添加新的元素e

    public void add(E e) {

        root = add(root, e);

    }

    // 向以node为根的二分搜索树中插入元素e,递归算法

    // 返回插入新节点后二分搜索树的根

    private Node add(Node node, E e) {

        if (node == null) {

            size++;

            return new Node(e);

        }

        if (e.compareTo(node.e) < 0) {

            node.left = add(node.left, e);

        } else if (e.compareTo(node.e) > 0) {

            node.right = add(node.right, e);

        }

        return node;

    }

    public boolean contains(E e) {

        return contains(root, e);

    }

    private boolean contains(Node node, E e) {

        if (node == null) {

            return false;

        }

        if (e.compareTo(node.e) == 0) {

            return true;

        } else if (e.compareTo(node.e) < 0) {

            return contains(node.left, e);

        } else {

            return contains(node.right, e);

        }

    }

    // 查找二分搜索树的最小元素

    public E minimum() {

        if (size == 0) {

            throw new IllegalArgumentException("BST is empty");

        }

        return minimum(root).e;

    }

    // 返回以node为根的二分搜索树的最小值所在的节点

    private Node minimum(Node node) {

        if (node.left == null) {

            return node;

        }

        return minimum(node.left);

    }

    // 删除BST的最小值

    public E removeMin() {

        E ret = minimum();

        root = removeMin(root);

        return ret;

    }

    // 删除以node为根的BST中的最小值节点

    // 返回删除节点后新的BST的根

    private Node removeMin(Node node) {

        if (node.left == null) {

            Node rightNode = node.right;

            node.right = null;

            size--;

            return rightNode;

        }

        node.left = removeMin(node.left);

        return node;

    }

    public void remove(E e) {

        root = remove(root, e);

    }

    private Node remove(Node node, E e) {

        if (node == null) {

            return null;

        }

        if (e.compareTo(node.e) < 0) {

            node.left = remove(node.left, e);

            return node;

        } else if (e.compareTo(node.e) > 0) {

            node.right = remove(node.right, e);

            return node;

        } else { // e == node.e

            // 待删除节点左子树为空的情况

            if (node.left == null) {

                Node rightNode = node.right;

                node.right = null;

                size--;

                return rightNode;

            }

            // 待删除节点右子树为空的情况

            if (node.right == null) {

                Node leftNode = node.left;

                node.left = null;

                size--;

                return leftNode;

            }

            // 待删除节点左右子树均不为空的情况

            // 找到比待删除节点大的最小节点, 即待删除节点右子树的最小节点

            // 用这个节点顶替待删除节点的位置

            Node successor = minimum(node.right);

            successor.right = removeMin(node.right);

            successor.left = node.left;

            node.left = node.right = null;

            return successor;

        }

    }

    @Override

    public String toString() {

        StringBuilder res = new StringBuilder();

        generateBSTString(root, 0, res);

        return res.toString();

    }

    // 生成以node为根节点,深度为depth的描述二叉树的字符串

    private void generateBSTString(Node node, int depth, StringBuilder res) {

        if (node == null) {

            res.append(generateDepthString(depth) + "null

");

            return;

        }

        res.append(generateDepthString(depth) + node.e + "

");

        generateBSTString(node.left, depth + 1, res);

        generateBSTString(node.right, depth + 1, res);

    }

    private String generateDepthString(int depth) {

        StringBuilder res = new StringBuilder();

        for (int i = 0; i < depth; i++) {

            res.append("--");

        }

        return res.toString();

    }

}

以上代码重写了BinarySearchTree类,将Node作为内部类实现,并具有以下功能:

1.创建BinarySearchTree实例

2.插入元素或节点

3.删除元素或节点

4.查找元素或节点

5.获取最小值

6.根据深度输出树形结构

最后,我们可以使用以下代码来测试程序

public class Main {

    public static void main(String[] args) {

        BinarySearchTree<Integer> bst = new BinarySearchTree<>();

        int[] array = { 5, 3, 6, 8, 4, 2 };

        for (int i = 0; i < array.length; i++) {

            bst.add(array[i]);

        }

        System.out.println(bst);

        bst.remove(3);

        System.out.println(bst);

    }

}

输出结果:

--5

----3

------2

------4

----6

------8

--5

----4

------2

------6

--------8

通过以上简单测试,我们可以得出结论:二叉搜索树能够有效地进行元素的增、删、查操作。本文代码可以直接在Java环境中运行测试,希望对大家能有所帮助。