如何在Java中实现二叉树和堆数据结构?
发布时间:2023-06-25 07:09:49
二叉树是一种基本的数据结构,它由一个根节点和一些称为子节点的下一级节点组成。每个节点最多有两个子节点,左子节点和右子节点。实现二叉树需要一个二叉树节点类和一些方法,例如插入和删除节点(平衡二叉树)。
以下是一个简单的二叉树节点类的实现:
class BinaryTreeNode {
int data; //节点数据
BinaryTreeNode left; //左子节点
BinaryTreeNode right; //右子节点
public BinaryTreeNode(int data) {
this.data = data;
left = right = null; //初始没有左子节点和右子节点
}
}
下面是二叉树的插入和删除节点的方法:
class BinaryTree {
BinaryTreeNode root; //二叉树的根节点
public BinaryTree() {
root = null;
}
//插入节点方法
public void insert(int data) {
root = insertRec(root, data);
}
//递归插入节点
private BinaryTreeNode insertRec(BinaryTreeNode root, int data) {
if (root == null) { //树为空
root = new BinaryTreeNode(data);
return root;
}
if (data < root.data) { //插入节点比当前节点小,插入到左子树
root.left = insertRec(root.left, data);
} else if (data > root.data) { //插入节点比当前节点大,插入到右子树
root.right = insertRec(root.right, data);
}
return root;
}
//删除节点方法
public void delete(int data) {
root = deleteRec(root, data);
}
//递归删除节点
private BinaryTreeNode deleteRec(BinaryTreeNode root, int data) {
if (root == null) { //节点不存在
return root;
}
if (data < root.data) { //要删除的节点比当前节点小,在左子树中删除
root.left = deleteRec(root.left, data);
} else if (data > root.data) { //要删除的节点比当前节点大,在右子树中删除
root.right = deleteRec(root.right, data);
} else { //找到要删除的节点
if (root.left == null) { //没有左子节点,将右子节点替换当前节点
return root.right;
} else if (root.right == null) { //没有右子节点,将左子节点替换当前节点
return root.left;
}
//左右子节点都存在,找到右子树中最小的节点替换当前节点
root.data = minValue(root.right);
root.right = deleteRec(root.right, root.data);
}
return root;
}
//找到最小值
private int minValue(BinaryTreeNode node) {
int minVal = node.data;
while (node.left != null) {
minVal = node.left.data;
node = node.left;
}
return minVal;
}
}
堆是一种特殊的二叉树,需要实现堆节点类和有关方法,例如插入和删除节点,查找堆顶元素等。
以下是一个简单的堆节点类的实现:
class HeapNode {
int data; //节点数据
public HeapNode(int data) {
this.data = data;
}
}
下面是堆的实现:
class Heap {
ArrayList<HeapNode> heap; //堆节点列表
public Heap() {
heap = new ArrayList<HeapNode>();
}
//插入节点方法
public void insert(int data) {
HeapNode node = new HeapNode(data);
heap.add(node); //将新节点添加到节点列表末尾
int index = heap.size() - 1; //新节点位置
while (index > 0 && heap.get((index - 1) / 2).data < node.data) { //比较新节点和父节点,如果新节点比父节点大则交换
heap.set(index, heap.get((index - 1) / 2));
index = (index - 1) / 2;
}
heap.set(index, node);
}
//删除节点方法
public void delete(int data) {
int index = heap.indexOf(new HeapNode(data)); //查找要删除的节点位置
if (index == -1) { //节点不存在
return;
}
HeapNode lastNode = heap.get(heap.size() - 1); //找到最后一个节点
heap.set(index, lastNode); //将最后一个节点替换要删除的节点
heap.remove(heap.size() - 1); //移除最后一个节点
int current = index;
int parent = (current - 1) / 2;
if (heap.size() > 0 && current != 0 && heap.get(current).data > heap.get(parent).data) { //新节点与父节点比较,如果新节点比父节点大则交换
while (parent >= 0 && heap.get(current).data > heap.get(parent).data) {
HeapNode temp = heap.get(current);
heap.set(current, heap.get(parent));
heap.set(parent, temp);
current = parent;
parent = (current - 1) / 2;
}
} else { //新节点与子节点比较,如果新节点比子节点小则交换
int child1 = 2 * current + 1;
int child2 = 2 * current + 2;
while (child1 < heap.size() || child2 < heap.size()) {
if (child1 < heap.size() && heap.get(current).data < heap.get(child1).data) {
HeapNode temp = heap.get(current);
heap.set(current, heap.get(child1));
heap.set(child1, temp);
current = child1;
} else if (child2 < heap.size() && heap.get(current).data < heap.get(child2).data) {
HeapNode temp = heap.get(current);
heap.set(current, heap.get(child2));
heap.set(child2, temp);
current = child2;
}
child1 = 2 * current + 1;
child2 = 2 * current + 2;
}
}
}
//获取堆顶元素方法
public int getTop() {
return heap.size() > 0 ? heap.get(0).data : -1; //存在堆顶元素则返回堆顶元素,否则返回-1
}
}
以上就是在Java中实现二叉树和堆数据结构的方法。要实现更高级的数据结构,需要对数据结构的理解更深入,并借助Java的杂项类和数据结构类。
