依旧是看了代码随想录,但是他的解法里的第五种情况,即左孩子和右孩子都不为空的处理我不太明白,也和之前数据结构学的不太一样。最后我还是用数据结构学的解法写了代码,并最终AC了,记录一下,有需要的同学可以看一下哈。 解法:左孩子,右孩子都不为空,则将前驱或者后继的值(带代码里选择了后继,也就是右子树最左下的结点)覆盖当前结点的值,再删除相应的前驱或者后继。
class Solution {
public TreeNode deleteNode(TreeNode T, int val) {
if(T == null) return null;
if(T.val == val){
if(T.left == null && T.right == null){
return null;
}else if(T.left != null && T.right == null){
return T.left;
}else if(T.left == null && T.right != null){
return T.right;
}else{
TreeNode p = T.right;
TreeNode pre = T;
while(p.left != null){
pre = p;
p = p.left;
}
T.val = p.val;
if(p == pre.right) pre.right = deleteNode(p, T.val);
else pre.left = deleteNode(p, T.val);
return T;
}
}else if(T.val < val){
T.right = deleteNode(T.right, val);
}else{
T.left = deleteNode(T.left, val);
}
return T;
}
}
|