考虑情况
二叉排序树的删除情况比较复杂,有下面三种情况要考虑 1.删除叶子节点 2.删除只有一颗子树的节点 3.删除有两颗子树的节点
思路分析
第一种情况:删除叶子节点
思路: 1.需求先去找到要删除的节点targetNode 2.找到targetNode的父节点parent 3.确定targetNode是parent的左子节点还是右子节点 4.根据情况对应删除
第二种情况:删除只有一颗子树的节点
思路: 1.需求先去找到要删除的节点targetNode 2.找到targetNode的父节点parent 3.确定targetNode的子节点是左子节点还是右子节点 4.确定targetNode是parent的左子节点还是右子节点 5.如果targetNode有左子节点 5.1如果targetNode是parent的左子节点,parent.left=targetNode.left。 5.2如果targetNode是parent的右子节点,parent.right=targetNode.left。 6.如果targeyNode有右子节点 6.1如果targetNode是parent的左子节点,parent.left=targetNode.right. 6.2如果targetNode是parent的右子节点,parent.right=targetNode.right
第三种情况:删除有两颗子树的节点
思路: 1.需求先去找到要删除的节点targetNode 2.找到targetNode的父节点parent 3.从targetNode的右子树找到最小的节点 4.用一个临时变量,将最小节点的值保存 5.删除该最小节点 6.targetNode.value=temp
代码实现
public Nodes
search(int value
) {
if(value
==this.value
) {
return this;
}else if(value
<this.value
) {
if(this.left
==null) {
return null;
}
return this.left
.search(value
);
}else {
if(this.right
==null) {
return null;
}
return this.right
.search(value
);
}
}
public Nodes
searchParent(int value
) {
if((this.left
!=null&&this.left
.value
==value
)||(this.right
!=null&&this.right
.value
==value
)) {
return this;
}else {
if(value
<this.value
&&this.left
!=null) {
return this.left
.searchParent(value
);
}else if(value
>=this.value
&&this.right
!=null){
return this.right
.searchParent(value
);
}else {
return null;
}
}
}
public Nodes
search(int value
) {
if(root
==null) {
return null;
}else {
return root
.search(value
);
}
}
public Nodes
searchParent(int value
) {
if(root
==null) {
return null;
}else {
return root
.searchParent(value
);
}
}
public void delNode(int value
) {
if(root
==null) {
return;
}else {
Nodes targetNode
=search(value
);
if(targetNode
==null) {
return;
}
if(root
.left
==null&&root
.right
==null) {
root
=null;
return;
}
Nodes parent
=searchParent(value
);
if(targetNode
.left
==null&&targetNode
.right
==null) {
if(parent
.left
!=null&&parent
.left
.value
==value
) {
parent
.left
=null;
}else if(parent
.right
==null&&parent
.right
.value
==value
) {
parent
.right
=null;
}
}else if(targetNode
.left
!=null&&targetNode
.right
!=null) {
int minValue
=delRightTreeMin(targetNode
.right
);
targetNode
.value
=minValue
;
}else {
if(targetNode
.left
!=null) {
if(parent
.left
.value
==value
) {
parent
.left
=targetNode
.left
;
}else {
parent
.right
=targetNode
.left
;
}
}else {
if(parent
.left
.value
==value
) {
parent
.left
=targetNode
.right
;
}else {
parent
.right
=targetNode
.right
;
}
}
}
}
}
public int
delRightTreeMin(Nodes node
) {
Nodes target
=node
;
while(target
.left
!=null) {
target
=target
.left
;
}
delNode(target
.value
);
return target
.value
;
}