使用Java实现数据结构中的二叉查找树
发布时间:2023-05-30 05:17:49
二叉查找树(Binary Search Tree,BST)是一种数据结构,它是一颗二叉树,并且对于任何一个节点,它的左子树中的所有节点的键值小于该节点的键值,该节点的右子树中的所有节点的键值大于该节点的键值。
二叉查找树主要用于实现动态集合的操作,包括插入、删除和查找操作。在本文中,我们将使用Java语言来实现这些操作。
首先,我们定义一个节点类Node,其中包含节点的键值key以及左右子节点left和right:
class Node {
int key;
Node left, right;
Node(int item) {
key = item;
left = right = null;
}
}
接下来,我们定义一个二叉查找树类BST,其中包含插入、删除和查找操作:
class BST {
Node root;
void insert(int key) {
root = insertRecursive(root, key);
}
private Node insertRecursive(Node current, int key) {
if (current == null) {
return new Node(key);
}
if (key < current.key) {
current.left = insertRecursive(current.left, key);
} else if (key > current.key) {
current.right = insertRecursive(current.right, key);
} else {
// key already exists
return current;
}
return current;
}
void delete(int key) {
root = deleteRecursive(root, key);
}
private Node deleteRecursive(Node current, int key) {
if (current == null) {
return null;
}
if (key == current.key) {
// node to delete found
if (current.left == null && current.right == null) {
// node is a leaf
return null;
}
if (current.right == null) {
// node has one child (left)
return current.left;
}
if (current.left == null) {
// node has one child (right)
return current.right;
}
// node has two children
int smallestValue = findSmallestValue(current.right);
current.key = smallestValue;
current.right = deleteRecursive(current.right, smallestValue);
return current;
}
if (key < current.key) {
current.left = deleteRecursive(current.left, key);
return current;
}
current.right = deleteRecursive(current.right, key);
return current;
}
private int findSmallestValue(Node root) {
return root.left == null ? root.key : findSmallestValue(root.left);
}
boolean contains(int key) {
return containsRecursive(root, key);
}
private boolean containsRecursive(Node current, int key) {
if (current == null) {
return false;
}
if (key == current.key) {
return true;
}
return key < current.key
? containsRecursive(current.left, key)
: containsRecursive(current.right, key);
}
}
在上面的代码中,insert操作用于将给定的key插入到二叉查找树中,delete操作用于删除给定的key,contains操作用于检查给定的key是否存在于二叉查找树中。这些操作都是递归实现的。
最后,我们可以使用二叉查找树类来操作数据。例如:
public static void main(String[] args) {
BST bst = new BST();
bst.insert(6);
bst.insert(4);
bst.insert(8);
bst.insert(3);
bst.insert(5);
bst.insert(7);
bst.insert(9);
System.out.println(bst.contains(5)); // true
System.out.println(bst.contains(2)); // false
bst.delete(4);
System.out.println(bst.contains(4)); // false
}
这段代码创建了一个Binary Search Tree并插入了一些节点,然后检查了某些节点是否存在于二叉查找树中,最后删除了一个节点。
这就是如何使用Java实现二叉查找树。由于该代码是递归实现的,因此可能存在栈溢出的风险,需要谨慎使用。
