在Java中实现二叉查找树的函数
发布时间:2023-06-25 04:15:32
二叉查找树(Binary Search Tree)是一种特殊的二叉树结构,它的每个节点包含一个比其左子树中任何节点都大、比其右子树中任何节点都小的值,因此也被称为二叉排序树。由于它的查找和插入操作时间复杂度均为O(logn),因此被广泛应用于数据结构中。
在Java中实现二叉查找树,我们需要定义一个节点类和一个二叉查找树类。节点类包含三个属性:节点值、左子节点和右子节点。二叉查找树类包含一个根节点和若干个插入、查找、删除等操作的方法。
节点类的实现如下:
class Node {
public int value;
public Node left;
public Node right;
public Node(int value) {
this.value = value;
left = null;
right = null;
}
}
二叉查找树类的实现如下:
class BinarySearchTree {
public Node root;
public BinarySearchTree() {
root = null;
}
// 在树中插入一个节点
public void insert(int value) {
root = insert(root, value);
}
// 在子树中插入一个节点
private Node insert(Node node, int value) {
if (node == null) {
return new Node(value);
}
if (value < node.value) {
node.left = insert(node.left, value);
} else {
node.right = insert(node.right, value);
}
return node;
}
// 查找一个节点是否存在于树中
public boolean search(int value) {
return search(root, value);
}
// 在子树中查找一个节点
private boolean search(Node node, int value) {
if (node == null) {
return false;
}
if (node.value == value) {
return true;
} else if (value < node.value) {
return search(node.left, value);
} else {
return search(node.right, value);
}
}
// 删除一个节点
public void delete(int value) {
root = delete(root, value);
}
// 在子树中删除一个节点
private Node delete(Node node, int value) {
if (node == null) {
return null;
}
if (value == node.value) {
if (node.left == null && node.right == null) {
return null;
} else if (node.left == null) {
return node.right;
} else if (node.right == null) {
return node.left;
} else {
int minVal = findMin(node.right);
node.value = minVal;
node.right = delete(node.right, minVal);
return node;
}
} else if (value < node.value) {
node.left = delete(node.left, value);
return node;
} else {
node.right = delete(node.right, value);
return node;
}
}
// 找到子树中最小的节点值
private int findMin(Node node) {
while (node.left != null) {
node = node.left;
}
return node.value;
}
}
其中,insert()方法用于向树中插入一个节点,它递归地调用insert()方法来在子树中寻找插入位置;search()方法用于查找树中是否存在某个节点,它也递归地调用search()方法来在子树中查找目标节点;delete()方法用于删除树中的一个节点,它递归地调用delete()方法来在子树中删除目标节点;findMin()方法用于找到子树中最小的节点,它在向右子树寻找最小值的过程中不断地向左移动。
总之,二叉查找树类的实现十分简单易懂,通过递归实现了插入、查找和删除等操作,这对于理解Java中的递归方法的实现方式和使用十分有帮助。
