此代码仅供参考,如有疑问欢迎评论:
二叉树的删除操作比较复杂,主要分三种情况:1、删除没有子节点的节点,2、删除只有一个节点的节点(其中有分为两种情况),3、删除有两个节点的节点。
在讲解之前我先把查找的代码附上,以为删除过程需要用到这段儿查找的代码:
public
TreeNode search(
int
key) {
TreeNode pNode =
root
;
while
(pNode !=
null
) {
if
(key == pNode.
key
) {
return
pNode;
}
else
if
(key > pNode.
key
) {
pNode = pNode.
rchild
;
}
else
if
(key < pNode.
key
) {
pNode = pNode.
lchild
;
}
}
return
null
;
// 如果没有搜索到结果那么就只能返回空值了
}
首先看第一种情况:(删除没有子节点的节点)
删除没有子节点的节点只需要将被删除节点的父节点指向空即可
if
(pNode.
lchild
==
null
&& pNode.
rchild
==
null
) {
if
(pNode ==
root
) {
//如果是根节点,那么就删除整棵树
root
=
null
;
}
else
if
(pNode == pNode.
parent
.
lchild
){
//如果这个节点是父节点的左节点,则将父节点的左节点设为空
pNode.
parent
.
lchild
=
null
;
}
else
if
(pNode == pNode.
parent
.
rchild
) {
//如果这个节点是父节点的右节点,则将父节点的右节点设为空
pNode.
parent
.
rchild
=
null
;
}
}
第二种情况:(删除只有一个子节点的节点)
删除有一个子节点的节点,只需要将被删除节点的父节点指向删除节点的子节点即可
//第二种情况: (删除有一个子节点的节点)
//如果要删除的节点只有右节点
if
(pNode.
lchild
==
null