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树。