欢迎访问宙启技术站
智能推送

如何在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的杂项类和数据结构类。