Java中的二叉搜索树

二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树,其中每个节点都遵循以下性质:对于任何节点,左子树中所有节点的值都小于该节点的值,右子树中所有节点的值都大于该节点的值。这种结构使得它非常适合用于查找、插入和删除操作,时间复杂度在平均情况下为O(log n),最坏情况下为O(n)。

基本操作

在Java中实现二叉搜索树,首先需要定义一个节点类,然后实现插入、查找和删除等基本操作。

节点类

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
        left = null;
        right = null;
    }
}

二叉搜索树类

class BinarySearchTree {
    private TreeNode root;

    public BinarySearchTree() {
        root = null;
    }

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

    private TreeNode insertRec(TreeNode root, int val) {
        if (root == null) {
            root = new TreeNode(val);
            return root;
        }
        if (val < root.val) {
            root.left = insertRec(root.left, val);
        } else if (val > root.val) {
            root.right = insertRec(root.right, val);
        }
        return root;
    }

    // 查找操作
    public boolean search(int val) {
        return searchRec(root, val);
    }

    private boolean searchRec(TreeNode root, int val) {
        if (root == null) {
            return false;
        }
        if (val == root.val) {
            return true;
        } else if (val < root.val) {
            return searchRec(root.left, val);
        } else {
            return searchRec(root.right, val);
        }
    }

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

    private TreeNode deleteRec(TreeNode root, int val) {
        if (root == null) {
            return root;
        }

        if (val < root.val) {
            root.left = deleteRec(root.left, val);
        } else if (val > root.val) {
            root.right = deleteRec(root.right, val);
        } else {
            // 找到要删除的节点
            if (root.left == null) {
                return root.right;
            } else if (root.right == null) {
                return root.left;
            }

            // 找到右子树的最小值
            root.val = minValue(root.right);
            root.right = deleteRec(root.right, root.val);
        }
        return root;
    }

    private int minValue(TreeNode root) {
        int minVal = root.val;
        while (root.left != null) {
            minVal = root.left.val;
            root = root.left;
        }
        return minVal;
    }

    // 中序遍历
    public void inorder() {
        inorderRec(root);
    }

    private void inorderRec(TreeNode root) {
        if (root != null) {
            inorderRec(root.left);
            System.out.print(root.val + " ");
            inorderRec(root.right);
        }
    }
}

代码示例

下面是一个使用二叉搜索树的示例,演示如何插入、查找、删除和遍历节点。

public class Main {
    public static void main(String[] args) {
        BinarySearchTree bst = new BinarySearchTree();

        // 插入节点
        bst.insert(50);
        bst.insert(30);
        bst.insert(20);
        bst.insert(40);
        bst.insert(70);
        bst.insert(60);
        bst.insert(80);

        // 中序遍历
        System.out.println("中序遍历:");
        bst.inorder(); // 输出:20 30 40 50 60 70 80

        // 查找节点
        System.out.println("\n查找40: " + bst.search(40)); // 输出:true
        System.out.println("查找100: " + bst.search(100)); // 输出:false

        // 删除节点
        bst.delete(20);
        System.out.println("删除节点20后,中序遍历:");
        bst.inorder(); // 输出:30 40 50 60 70 80

        bst.delete(30);
        System.out.println("\n删除节点30后,中序遍历:");
        bst.inorder(); // 输出:40 50 60 70 80

        bst.delete(50);
        System.out.println("\n删除节点50后,中序遍历:");
        bst.inorder(); // 输出:40 60 70 80
    }
}

总结

二叉搜索树是一种高效的数据结构,它允许快速的动态元素查找与管理。上述代码示例展示了基本的插入、查找、删除和遍历操作。要注意的是,在极端情况下(例如插入有序数据),BST可能退化为链表,此时查找复杂度为O(n)。为了防止这种情况,可以考虑自平衡的树结构,如红黑树或AVL树。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部