您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
二叉查找树(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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。