我如何删除最大节点。我想删除整个Node如果它的元素等于最大元素;)

时间:2019-11-29 08:40:33

标签: java binary-tree

如何删除Binarytree中的最大Node。如果它的元素等于最大元素,我想删除整个Node;)我可以返回最大节点,但是如何删除它。不在BinarySearchTree中。

public class MyLinkedBinaryTree extends LinkedBinaryTree {
MyLinkedBinaryTree() {
    super();
}

public void removeMax(BinaryTreeNode t, int i) {
    if ((int) t.element != i && t.rightChild != null && t.leftChild != null) {
        if (t.leftChild != null)
            removeMax(t.leftChild, i);
        if (t.rightChild != null)
            removeMax(t.rightChild, i);
    } else if ((int) root.element == i) {
        root = null;
    }
}

public int findMax(BinaryTreeNode t) {
    if (t == null)
        return 0;
    int res = (int) t.element;
    int lres = findMax(t.rightChild);
    int rres = findMax(t.leftChild);
    if (lres > res)
        res = lres;
    if (rres > res)
        res = rres;
    return res;
}

2 个答案:

答案 0 :(得分:0)

您只想删除最大节点(并重新分支其子节点)还是删除该节点及其所有子节点?

此外,节点应有权访问其子节点,但不能访问其根节点。您需要重构代码,以便能够删除子级之一(如果它是您的目标)(如果您理解的话,如果我理解的话,拥有最大价值的节点)。

答案 1 :(得分:0)

执行此操作的一种方法是更改​​findMax而不是返回值,而是返回包含该值的实际节点:

//DISCLAIMER: untested code
public BinaryTreeNode findMaxNode(BinaryTreeNode t) {
    if (t == null)
        return null;
    BinaryTreeNode max = t;
    BinaryTreeNode maxLeft = findMax(t.rightChild);
    BinaryTreeNode maxRight = findMax(t.leftChild);
    if (maxLeft!=null && maxLeft.element > t.element) {
        max = maxLeft;
    }
    if (maxRight !=null && maxRight .element > t.element) {
        max = maxRight ;
    }
    return max;
}

然后,您必须弄清楚如何从树中删除该节点。我假设它有一个指向其父节点的链接。然后我们可以将其从其父级中删除,从而将其从树中删除:

public void removeMax(BinaryTreeNode t) {
    if(t==null) return;
    BinaryTreeNode max = findMaxNode(t);
    //removing a node from its parent
    BinaryTreeNode parent = max.parent;
    if(parent==null) {
         //figure out what to do is the maximum value is at the root
    } else if(parent.leftChild==max) {
         parent.leftChild = null;
    } else if(parent.rightChild==max) {
         parent.rightChild = null;
    }
}

您需要弄清楚当根数达到最大值并删除整个树时该怎么做。

如果您的节点没有对其父节点的引用,则必须更新findMaxNode以返回最大节点的父节点。