当前位置: 首页 > 知识库问答 >
问题:

数组二进制树中的删除操作

易自珍
2023-03-14

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

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

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

2)而且当您有指向数组中节点的指针时,我只是找不到删除操作的复杂性。我正在考虑在删除节点时将所有节点向左移动。我认为它是O(n),我不知道如何改进它。我读到有些人正在使用 O(log n) 实现此操作。但他们没有说如何。(我将不胜感激Java中的任何代码片段)。

*请记住,我使用的是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;
    }
}

共有2个答案

萧安怡
2023-03-14

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

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

贝礼骞
2023-03-14

嗯,1)如果你有一个固定的布局,有一个索引的公式才起作用。然而,如果你没有一个平衡的树,这是对数组空间的浪费。On 2)解决O (log n)上的删除需要一个平衡树(如果不是BST——我不确定)。你可以使用谷歌找到如何轻松做到这一点的解释;).

 类似资料:
  • 我试着删除二叉查找树的节点,当我打印出来的时候,我得到的结果实际上不是这个删除,实际上可以删除二叉树本身的任何键。 我是二进制搜索树的新手。有人能帮我写代码吗?我们将感谢您的帮助。 谢谢 完整代码

  • 我正在一个实验室工作,该实验室要求我为二进制搜索树创建一个删除方法。这是我的remove方法的代码。 运行代码时得到的输出是: 移除90后的树。70 80 85 98 100 120 移除70. 80 85 98 100 120后的树 移除85后的树。80 98 100 120 移除98后的树。80 100 120 移除80后的树。100 120 移除120后的树。100 移除100后的树。100

  • 目前,我在理解如何在没有传递节点时从二进制搜索树中删除节点时遇到了一个问题。我有两个类,BSTSet和BSTNode,每个类都有一个remove方法。。 当我被传递一个节点时,我理解删除方法,但当我在根上调用remove方法并试图从node类中删除节点时,我不知道从何处开始。有人能告诉我吗?谢谢如果您想了解更多信息,请询问。

  • 我在C中实现了一个二进制搜索树。 对于delete方法,除了最后一种情况外,其他情况都可以使用,即唯一的树是父树,并且它指向两个空的子树。现在的问题是:我希望在删除子树后,打印出父树的左子树和右子树等于什么。它们和父项都应该为NULL,但是当我试图输出这些值时,我得到了一个状态访问冲突。 下面是有关删除的代码。我希望删除父节点,并设置树- 主要:

  • 我目前正在做一个学校项目,我必须为二叉搜索树编写一些辅助函数。其中一个函数从树中删除了一个节点。我正在尝试运行一些测试用例,但似乎无法让它们正常工作。我知道这个问题与我如何使用指针有关,但我不太确定我哪里出错了。 这是代码: 注意:我没有包括leftRoot()函数,但它相当简单,我知道它做了它应该做的事情(返回子树中最左边的根)下面是我的教授给我们的测试remove函数的代码部分: 如果有必要,

  • 我正在尝试从二叉查找树中删除节点。我可以成功地删除树上的任何其他节点,除了一个特殊的情况。如果目标节点有两个子节点,左边的子节点有右边的子树,我可以定位正确的替换节点,并将值切换到目标节点,但替换节点永远不会被删除。 看看上面的图片,如果我尝试删除17,程序将正确地导航到13,并用13替换17,但它不会像预期的那样删除原来的13。 我附加了我的remove方法和其中引用的方法。 这是我的Node类