Delete Node in a BST
给定一个二叉搜索树的根节点 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
另一个正确答案是 [5,2,6,null,4,null,7]。
5
/
2 6
\
4 7
之前的思路是找到那个点然后对那个点进行操作,后来发现我疏忽了一个点就是要改变这个结点不能单纯找到那个结点然后引用向别的结点,应该通过父节点的左右子树引用在递归中对返回值进行操作。
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if(root==null) return null;
if(root.val>key) {
root.left=deleteNode(root.left,key); //对左子树操作
}
else if(root.val<key) {
root.right=deleteNode(root.right,key);
}
else { //找到这个结点了
if(root.left==null) return root.right; //root为叶子节点或者只有一个子树
if(root.right==null) return root.left; //
TreeNode t=Find(root.right); //找到对于这个结点的中序遍历顺序的下一结点
root.val=t.val; //更改值
root.right=deleteNode(root.right,t.val);//删除原结点
}
return root;
}
private TreeNode Find(TreeNode root) {
while(root.left!=null) { //中序遍历中最左边的在前面,然后是中,后。
root=root.left; //最近邻的结点也就是以root的中序遍历的第一个是最左边
}
return root;
}
}