搜索二叉树删除比较麻烦,具体看代码里的解释:(删除带有两个子节点的节点需要用到中序后继节点)
//先寻找中序后继节点,再进行删除
//寻找中序后继节点
public Node getHouJiNode(Node delNode) {
//定义中序后继节点
Node houji = delNode;
//定义中序后继的父节点
Node houjiparent = delNode;
//当前节点
Node current = delNode.rightChild;
while(current != null) {
houjiparent = houji;
houji = current;
current = current.leftChild;//往左边找
}
//把删除节点替换成终须后继节点
//1.如果删除节点的右节点不是后继节点(正常右左左……找到的)
if(houji != delNode.rightChild) {
//中序后继的父节点的左子节点指向中序后继节点的右子节点(中序后继节点没有左子节点)
houjiparent.leftChild = houji.rightChild;
//后继的右边接上删除的右边,左边接上删除的左边
houji.rightChild = delNode.rightChild;
houji.leftChild = delNode.leftChild;
}
//2.删除节点的右节点就是中序后继节点,右边不用动,吧左边接上就可以
else {
houji.leftChild = delNode.leftChild;
}
return houji;
}
//删除节点delete
public boolean delete(long data) {
//引用当前节点
Node current = root;
//引用当前节点的父节点
Node parent = root;
//是左子节点还是右节点
boolean isLeftChild = true;
//循环找到要删的节点
while (current.data != data) {
parent = current;
if (current.data > data) {
current = current.leftChild;
isLeftChild = true;
} else {
current = current.rightChild;
isLeftChild = false;
}
//没有
if(current == null) {
return false;
}
}
//循环结束,current指向要删除节点,parent指向父节点
//进行删除current节点
//1.如果是叶子节点(没有子节点)
if (current.leftChild == null &¤t.rightChild ==null) {
if (current == root) {
root = null;
}
//如果是左边的节点
else if (isLeftChild) {
parent.leftChild = null;
}
//如果是右边的节点
else {
parent.rightChild = null;
}
}
//2.删除带有一个子节点的节点
else if (current.rightChild == null) {
//子节点是左子节点
if (current == root) {
root = current.leftChild;
}
else if (isLeftChild) {//删除的节点是左节点
//把父节点的左子节点指向删除节点的左子节点(接上去)
parent.leftChild = current.leftChild;
}
else {//删除的节点是右节点
parent.rightChild = current.leftChild;
}
}
else if (current.leftChild == null) {
//子节点是右子节点
if (current == root) {
root = current.rightChild;
}
else if (isLeftChild) {//删除的节点是左节点
parent.leftChild = current.rightChild;
}
else {//删除的节点是右节点
parent.rightChild = current.rightChild;
}
}
//3.删除有2个子节点的节点,需要寻找中续后继节点来替换删除节点
else {
Node houji = getHouJiNode(current);
if (current == root) {
root = houji;
}
else if (isLeftChild) {
parent.leftChild = houji;
}
else {
parent.rightChild = houji;
}
}
return true;
}