Java怎么实现二叉查找树的增删查

发布时间:2022-06-28 13:56:49 作者:iii
来源:亿速云 阅读:138

Java怎么实现二叉查找树的增删查

二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树,它满足以下性质:

二叉查找树的主要操作包括插入、删除和查找。本文将介绍如何在Java中实现这些操作。

1. 二叉查找树的节点定义

首先,我们需要定义一个二叉查找树的节点类。每个节点包含一个值、一个左子节点和一个右子节点。

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

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

2. 插入操作

插入操作的目标是将一个新节点插入到二叉查找树中,同时保持二叉查找树的性质。

class BST {
    private TreeNode root;

    public BST() {
        this.root = null;
    }

    public void insert(int val) {
        root = insertRec(root, val);
    }

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

        if (val < root.val) {
            root.left = insertRec(root.left, val);
        } else if (val > root.val) {
            root.right = insertRec(root.right, val);
        }

        return root;
    }
}

插入操作的解释

3. 查找操作

查找操作的目标是在二叉查找树中查找一个特定的值。

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);
    }
}

查找操作的解释

4. 删除操作

删除操作的目标是从二叉查找树中删除一个节点,同时保持二叉查找树的性质。

public void delete(int val) {
    root = deleteRec(root, val);
}

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

    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 minv = root.val;
    while (root.left != null) {
        minv = root.left.val;
        root = root.left;
    }
    return minv;
}

删除操作的解释

5. 完整代码示例

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

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

class BST {
    private TreeNode root;

    public BST() {
        this.root = null;
    }

    public void insert(int val) {
        root = insertRec(root, val);
    }

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

        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 null;
        }

        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 minv = root.val;
        while (root.left != null) {
            minv = root.left.val;
            root = root.left;
        }
        return minv;
    }
}

public class Main {
    public static void main(String[] args) {
        BST bst = new BST();
        bst.insert(50);
        bst.insert(30);
        bst.insert(20);
        bst.insert(40);
        bst.insert(70);
        bst.insert(60);
        bst.insert(80);

        System.out.println("查找20: " + bst.search(20)); // true
        System.out.println("查找90: " + bst.search(90)); // false

        bst.delete(20);
        System.out.println("删除20后查找20: " + bst.search(20)); // false

        bst.delete(30);
        System.out.println("删除30后查找30: " + bst.search(30)); // false

        bst.delete(50);
        System.out.println("删除50后查找50: " + bst.search(50)); // false
    }
}

6. 总结

本文介绍了如何在Java中实现二叉查找树的插入、查找和删除操作。二叉查找树是一种高效的数据结构,适用于需要频繁查找、插入和删除操作的场景。通过递归的方式,我们可以简洁地实现这些操作。希望本文对你理解二叉查找树的实现有所帮助。

推荐阅读:
  1. 如何实现二叉查找树
  2. python怎么实现二叉查找树

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:FeignClient怎么通过配置变量调用配置文件url

下一篇:怎么使用Matlab操作HDF5文件

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》