二叉树的删除要考虑三种情况 1.删除的节点是叶子节点2.删除的节点只有一个子树3.删除的节点有两个子树
删除的节点是叶子节点 找到删除的叶子结点tNode 找到目标节点的父节点pNode(考虑是否有父节点) 找到删除节点是父节点的左子树还是右子树 根据前边情况进行删除 右子树:p.rc=null 左子树:p.lc=null
删除的节点只有一个子树 找到删除的叶子结点tNode 找到目标节点的父节点pNode(考虑是否有父节点) 找到删除节点是父节点的左子树还是右子树 确定删除节点是左子树还是右子树 根据前边情况进行删除 tNode是它父节点的左子树 tNode有左子树 : pNode.lc=tNode.lc tNode有右子树 : pNode.lc=tNode.rc tNode是是它父节点的右子树 tNode有左子树 : pNode.rc=tNode.lc tNode有右子树 : pNode.rc=tNode.rc
删除的节点有两个子树 找到删除的叶子结点tNode 找到目标节点的父节点pNode(考虑是否有父节点) 找到删除节点右子树中最小的或找到左子树中最大的 将右子树当中最大的值替换掉删除节点的值 使删除叶子节点的逻辑,删除最小值
public TreeNode searchDelnode(TreeNode node,Integer val) {
if(node==null) {
return null;
}
if(node.val==val) {
return node;
}else if(val>node.val){
if(node.rightNode==null) {
return null;
}
return searchDelnode(node.rightNode, val);
}else {
if(node.leftNode==null) {
return null;
}
return searchDelnode(node.leftNode, val);
}
}
public TreeNode searchDelpartent(TreeNode node,Integer val) {
if(node==null) {
return null;
}
if((node.leftNode!=null&&node.leftNode.val==val)||(node.rightNode!=null&&node.rightNode.val==val)) {
return node;
}else {
if(node.leftNode!=null&&val<node.val) {
return searchDelpartent(node.leftNode, val);
}else if(node.rightNode!=null&&val>node.val){
return searchDelpartent(node.rightNode, val);
}else {
return null;
}
}
}
public void del(TreeNode node,Integer val) {
if(node==null) {
return;
}
TreeNode targetNode=searchDelnode(node, val);
if(targetNode==null) {
return;
}
TreeNode parentNode=searchDelpartent(node, val);
if(node.rightNode==null&&node.leftNode==null) {
root=null;
return;
}
if(parentNode==null&&(targetNode.rightNode!=null||targetNode.leftNode!=null)) {
int min=searchRightMin(targetNode.rightNode);
targetNode.val=min;
return;
}
if(targetNode.leftNode==null&&targetNode.rightNode==null) {
if(parentNode.rightNode!=null&&parentNode.rightNode.val==targetNode.val) {
parentNode.rightNode=null;
}else if(parentNode.leftNode!=null&&parentNode.leftNode.val==val){
parentNode.leftNode=null;
}
}else if(targetNode.leftNode!=null&&targetNode.rightNode!=null) {
int min=searchRightMin(targetNode.rightNode);
targetNode.val=min;
}else {
if(targetNode.rightNode!=null) {
if(parentNode.rightNode.val==targetNode.val) {
parentNode.rightNode=targetNode.rightNode;
}else {
parentNode.leftNode=targetNode.rightNode;
}
}else{
if(targetNode.rightNode.val==targetNode.val) {
parentNode.rightNode=targetNode.leftNode;
}else {
parentNode.leftNode=targetNode.leftNode;
}
}
}
}
|