您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树,它满足以下性质:
二叉查找树的主要操作包括插入、删除和查找。本文将介绍如何在Java中实现这些操作。
首先,我们需要定义一个二叉查找树的节点类。每个节点包含一个值、一个左子节点和一个右子节点。
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);
    }
}
false,表示未找到。true。删除操作的目标是从二叉查找树中删除一个节点,同时保持二叉查找树的性质。
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;
}
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
    }
}
本文介绍了如何在Java中实现二叉查找树的插入、查找和删除操作。二叉查找树是一种高效的数据结构,适用于需要频繁查找、插入和删除操作的场景。通过递归的方式,我们可以简洁地实现这些操作。希望本文对你理解二叉查找树的实现有所帮助。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。