簡體   English   中英

BST刪除節點的Java實現

[英]Java implementation of BST delete node

我正在嘗試創建一種方法來刪除BST中的節點,並且該節點不起作用。.我正在使用自己創建的Node類。嘗試調試,但是在解決代碼錯誤方面沒有太多幫助。

感謝有關如何使其工作的任何幫助。

public boolean delete(Node z)
{
    if (z == null)
        return false;

    Node x,y;
    if( z.getLeft() == null || z.getRight()== null)
        y = z;
    else { 
        y = (Node) successor(z);
    }
    if (y.getLeft() != null)
        x = y.getLeft();
    else x = y.getRight();
    if(x != null)
        x.setParent(y.getParent());
    if(y.getParent() == null) {
        this.node=x;
    }
    else if (y == y.getParent().getLeft())
    {
            y.getParent().setLeft(x);
    }
        else y.getParent().setRight(x);

    if(y==z)
        z.setKey(y.getKey());
    return true;    
}


public Node treeMinimum(Node x) {
    while (x.getLeft() != null)
        x = x.getLeft();

    return x;
}

public Node successor(Node node) {
    Node x = node;

    if (x.getRight() != null)
        return treeMinimum(x.getRight());

    Node y = x.getParent();
    while (y != null && x == y.getRight()) {
        x = y;
        y = y.getParent();
    }

    return y;
}
// Here is the complete solution
public void delete(final Integer data) {
    root = delete(root, data);
}

public Node<OInfo> delete(Node<OInfo> node, final Integer data) {
    if (node == null) {
        return null;
    }

    int cmp = data.compareTo(new Integer(node.getData().data));
    if (cmp < 0) {
        node.setLeft(delete(node.getLeft(), data));
    } else if (cmp > 0) {
        node.setRight(delete(node.getRight(), data));
    } else {
        boolean isRoot = false;
        if (root == node) {
            isRoot = true;
        }
        if (node.getLeft() == null) {
            return node.getRight();
        }
        if (node.getRight() == null) {
            return node.getLeft();
        }
        Node<OInfo> t = node;
        node = findMinimum(t.getRight());
        node.setRight(deleteMin(t.getRight()));
        node.setLeft(t.getLeft());
        if (isRoot) {
            root = node;
        }
    }

    return node;
}

private Node<OInfo> deleteMin(Node<OInfo> node) {
if (node.getLeft() == null) {
    return node.getRight();
    }
node.setLeft(deleteMin(node.getLeft()));
return node;
}

private Node<OInfo> findMinimum(Node<OInfo> node) {
if (node == null) {
    throw new IllegalArgumentException("Null value of node provided.");
}

if (node.getLeft() == null) {
    return node;
} else {
    return findMinimum(node.getLeft());
}
}

希望這可以幫助

/**
 * Internal method to remove from a subtree.
 *
 * @param x the item to remove.
 * @param t the node that roots the tree.
 * @return the new root.
 * @throws ItemNotFoundException if x is not found.
 */
protected BinaryNode remove(Comparable x, BinaryNode t) {
    if (t == null) {
        throw new ItemNotFoundException(x.toString());
    }
    if (x.compareTo(t.element) < 0) {
        t.left = remove(x, t.left);
    } else if (x.compareTo(t.element) > 0) {
        t.right = remove(x, t.right);
    } else if (t.left != null && t.right != null) { // Two children
        t.element = findMin(t.right).element;
        t.right = removeMin(t.right);
    } else {
        t = (t.left != null) ? t.left : t.right;
    }
    return t;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM