题目:
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
示例:
root = [5,3,6,2,4,null,7]
key = 3
5
/
3 6
/ \
2 4 7
给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
5
/
4 6
/
2 7
思路:
两个子方法,
一个查找有右子树的情况下,右子树的最小值
另一个查找有左子树的情况下左子树的最大值
递归修改字符串,查找到数据不是结束,而是以获得的新值为目标,查询子树修改新值的节点
直到新值修改完后不用再修改。
class Solution {
public int after(TreeNode root){
root = root.right;
while(root.left!=null) root = root.left;
return root.val;
}
public int pre(TreeNode root){
root = root.left;
while(root.right!=null) root = root.right;
return root.val;
}
public TreeNode deleteNode(TreeNode root, int key) {
if(root==null)
return null;
if(key > root.val){
root.right = deleteNode(root.right,key);
}else if(key < root.val){
root.left = deleteNode(root.left,key);
}else{
if(root.left==null && root.right==null){
root = null;
}else if(root.right!=null){
root.val = after(root);
root.right = deleteNode(root.right,root.val);
}else{
root.val = pre(root);
root.left = deleteNode(root.left,root.val);
}
}
return root;
}
}