我理解算法,但我不确定如何将其放入实际代码中。请帮忙!还请详细解释。除了简单地复制答案之外,我真的想要理解这一点。 ;)
以下是我的代码:
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;
}
答案 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)