【问题标题】:Delete operation in Array Binary Tree数组二叉树中的删除操作
【发布时间】:2014-11-23 18:18:16
【问题描述】:

我知道你们会抱怨这个问题被一次又一次地问到。抱歉,我没有在 Google/Stackoverflow/Forums... 等中找到我的答案

我正在用 Java 创建一个数组二叉树(它不是搜索树)。

1) 我的节点具有以下属性:父节点、左节点和右节点。分别是父、左子、右子的索引个数。我的教授告诉我这样做,我不知道为什么,因为你可以通过公式找到父母和孩子的索引,我希望有人告诉我如何添加父母/左/右的索引帮助我解决操作的复杂性。

2) 当你有一个指向数组中节点的指针时,我只是找不到删除操作的复杂性。我正在考虑在删除节点时将所有节点向左移动。我认为它是 O(n),我不知道如何改进它。我读到有些人用 O(log n) 来实现这个操作。但他们没有说如何。 (我会欣赏 Java 中的任何 sn-p 代码)。

*请记住,我正在使用 Java 中的 ArrayList。

一些代码:

public class ArrayBinaryTree<E> implements BinaryTree<E> {
    private class BTPos<T> implements Position<T> {
        private T element;
        private int parent;
        private int left;
        private int right;
        private int index;

        /** Main constructor */
        public BTPos(T element, int index, int parent, int left, int right) {
            setIndex(index);
            setElement(element);
            setParent(parent);
            setLeft(left);
            setRight(right);
        }

        /** Returns the index */
        public int getIndex() {
            return index;
        }

        /** Sets the index */
        public void setIndex(int i) {
            index = i;
        }

        /** Returns the element stored at this position */
        public T getElement() {
            return element;
        }

        /** Sets the element stored at this position */
        public void setElement(T o) {
            element = o;
        }

        /** Returns the parent */
        public int getParent() {
            return parent;
        }

        /** Sets the index */
        public void setParent(int i) {
            parent = i;
        }

        /** Returns the left */
        public int getLeft() {
            return left;
        }

        /** Sets the left */
        public void setLeft(int i) {
            left = i;
        }

        /** Returns the right */
        public int getRight() {
            return right;
        }

        /** Sets the right */
        public void setRight(int i) {
            right = i;
        }
    }
    private List<BTPos<E>> tree;
    private int size;
    private final int MAX_SIZE;

    /** Creates an empty binary tree. */
    public ArrayBinaryTree() {
        this.MAX_SIZE = 100;
        this.tree = new ArrayList<BTPos<E>>(this.MAX_SIZE);
        this.size = 0;
    }
}

【问题讨论】:

    标签: java arrays tree binary-tree


    【解决方案1】:

    好吧 1) 只有当你有一个固定的布局时,才有一个索引公式。但是,如果您没有平衡树,那么这会浪费阵列中的空间。在 2) 解决 O (log n) 上的删除需要平衡树(如果不是 BST - 我不确定)。您可以使用 Google 找到如何轻松完成此操作的说明;)。

    【讨论】:

    • 我不明白 1) 的答案。你的意思是,我不需要存储父/子/索引值?
    • 这取决于您如何在阵列中存储节点。您没有分享此信息。
    • 好的,我所做的是数组的每个元素都是一个指向 BTPos 对象的指针
    • 是的,从给定的代码中可以清楚地看到。但是您将如何计算索引?为此,您需要在数组中有一个众所周知的序列。
    • 你的意思是这些公式吗:2i + 12i + 2(i - 1)/2
    【解决方案2】:

    1) 将父/左/右索引存储在节点中只会浪费内存,因为无论如何您都可以使用公式来实现它。

    2)如果您已经有一个指向要删除的节点的指针,那么删除的复杂性将是 O(1),您可以简单地用特殊符号将该节点标记为已删除,而不是移动所有节点靠左。通过这种方式,您可以在插入时重用节点(另外,您没有创建 BST,然后可以在已删除的节点中进行任何插入)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2022-07-07
      • 2011-11-28
      • 1970-01-01
      相关资源
      最近更新 更多