删除二叉搜索树中的最小值

时间:2013-11-10 23:13:16

标签: java binary-search-tree remove-method

我理解算法,但我不确定如何将其放入实际代码中。请帮忙!还请详细解释。除了简单地复制答案之外,我真的想要理解这一点。 ;)

以下是我的代码:

 public boolean getLeftChild(){
    Node insertNode = root;
    while(insertNode!=null){
        insertNode = insertNode.left;
    }
    return true;
}
public Boolean removeMin(){
    Node insertNode = root;
    Node parentNode =root;

        if (insertNode.left ==null){
            insertNode.right = parentNode;
            insertNode = null;

        }else if (getLeftChild() ==true && insertNode.right != null){
            insertNode.left = null;
        }else{
            parentNode.left = insertNode.right;

    }
        return true;
}

1 个答案:

答案 0 :(得分:0)

第一件事:对于树木,我强烈推荐递归。

只是一个例子:

getSmallestNode(Node node){
     if(node.left != null){
         return getSmallestNode(node.left)
     }

     return node;
}

对于删除,如果你想删除二叉树的最小(因此是“最左边的叶子”),可能有两种情况。

案例1:叶子没有子节点,在这种情况下只需将父节点中的相应条目设置为null(mostLeftChild.getParent().left = null

案例2:叶子有一个右子节点(不能有一个左子节点,因为这意味着会有一个较小的节点,而你当前选择的节点不是最小的节点)在这种情况下你替换当前节点左节点具有右子树mostLeftChild.getParent().left = getSmallestFromSubtree(mostLeftChild.right)

的最小节点

所以现在把它变成代码,它看起来像这样(不能保证它真的有效)

public Node deleteSmallest(Node node){
    // haven't reached leaf yet
    if(node.left != null{
        return deleteSmallest(node.left)
    }

    // case 1, no child nodes
    if(node.right == null){
        node.getParent().left = null;
    } else { // case 2, right child node
        node.getParent().left = deleteSmallest(node.right)
    }

    return node;
}

你可以用deleteSmallest(root)

来称呼它