首页常见问题正文

用java代码实现二进制搜索树

更新时间:2023-03-06 来源:黑马程序员 浏览量:

IT培训班

  Java中的二进制搜索树(Binary Search Tree,简称BST)是一种基于二分查找的数据结构,其中每个节点都包含一个键值和对应的值,同时满足以下性质:

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

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

  3.每个子树都是BST。

  以下是Java代码实现二进制搜索树的基本操作(kotlin):

public class BinarySearchTree {
    private Node root;

    private class Node {
        private int key;
        private Node left, right;

        public Node(int key) {
            this.key = key;
        }
    }

    public BinarySearchTree() {
        root = null;
    }

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

    private Node insert(Node x, int key) {
        if (x == null) return new Node(key);
        if (key < x.key) x.left = insert(x.left, key);
        else if (key > x.key) x.right = insert(x.right, key);
        return x;
    }

    // 查找操作
    public boolean contains(int key) {
        return contains(root, key);
    }

    private boolean contains(Node x, int key) {
        if (x == null) return false;
        if (key == x.key) return true;
        else if (key < x.key) return contains(x.left, key);
        else return contains(x.right, key);
    }

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

    private Node delete(Node x, int key) {
        if (x == null) return null;
        if (key < x.key) x.left = delete(x.left, key);
        else if (key > x.key) x.right = delete(x.right, key);
        else {
            if (x.right == null) return x.left;
            if (x.left == null) return x.right;
            Node t = x;
            x = min(t.right);
            x.right = deleteMin(t.right);
            x.left = t.left;
        }
        return x;
    }

    private Node deleteMin(Node x) {
        if (x.left == null) return x.right;
        x.left = deleteMin(x.left);
        return x;
    }

    private Node min(Node x) {
        if (x.left == null) return x;
        return min(x.left);
    }
}

  以上是基本的二进制搜索树操作,包括插入、查找、删除等。需要注意的是,这里实现的二进制搜索树并不是平衡树,因此在最坏情况下,树的高度可能会达到 $N$,其中 $N$ 是树中节点的数量,导致时间复杂度退化为 $O(N)$。为了解决这个问题,可以使用平衡二叉树(如红黑树、AVL树等)来代替二进制搜索树。

分享到:
在线咨询 我要报名
和我们在线交谈!