33,008
社区成员
发帖
与我相关
我的任务
分享
if (T->Left && T-Right) /* two children */
{
TmpCell = FindMin(T->Right);
T->Element = TmpCell->Element;
T->Right = Delete(T->Element, T->Right);
}
/**
* 1。若p有左子树,用p的左孩子取代它;
* 找到其左子树的最右边的叶子结点r,
* 把p的右子树作为r的右子树。
* 2。若p没有左子树,直接用p的右孩子取代它。
* @param key
*/
public void deleteValue(T key){
if(key == null){
return;
}
BinTreeNode<T>node = new BinTreeNode<T>(key);
if(this.getRootNode() == null || this.getRootNode().getValue() == null){
return;
}
BinTreeNode<T>parentNode = this.getRootNode();
BinTreeNode<T>tempNode = this.getRootNode();
while(true){
if(tempNode.compareTo(node) == 0){
//找到要删除的结点了
//case 1 tempNode有左子树
if(tempNode.getLeftNode()!=null){
BinTreeNode<T>leftNode = tempNode.getLeftNode();
BinTreeNode<T>rightNode = tempNode.getRightNode();
BinTreeNode<T>subLeftNode = leftNode.getLeftNode();
BinTreeNode<T>subRightNode = leftNode.getRightNode();
tempNode.setValue(leftNode.getValue());
leftNode.setLeftNode(null);
leftNode.setRightNode(null);
leftNode = null;
tempNode.setLeftNode(subLeftNode);
tempNode.setRightNode(subRightNode);
while(tempNode.getRightNode()!=null){
tempNode = tempNode.getRightNode();
}
tempNode.setRightNode(rightNode);
}
//case 2 tempNode无左子树
else{
if(tempNode.getRightNode()==null){
if(parentNode.compareTo(this.getRootNode())==0){
this.rootNode = null;
return;
}
if(parentNode.getLeftNode()!=null&&parentNode.getLeftNode().compareTo(tempNode)==0){
parentNode.setLeftNode(null);
}else{
parentNode.setRightNode(null);
}
tempNode = null;
}else{
BinTreeNode<T>leftNode = tempNode.getRightNode().getLeftNode();
BinTreeNode<T>rightNode = tempNode.getRightNode().getRightNode();
BinTreeNode<T>tempRightNode = tempNode.getRightNode();
tempNode.setLeftNode(leftNode);
tempNode.setRightNode(rightNode);
tempNode.setValue(tempRightNode.getValue());
tempRightNode.setLeftNode(null);
tempRightNode.setRightNode(null);
tempRightNode = null;
}
}
//删除end
return;
}else if(tempNode.compareTo(node)>0){
if(tempNode.getLeftNode()==null){
return;
}else{
parentNode = tempNode;
tempNode = tempNode.getLeftNode();
}
}else{
if(tempNode.getRightNode()==null){
return;
}else{
parentNode = tempNode;
tempNode = tempNode.getRightNode();
}
}
}
}