给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/delete-node-in-a-bst
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例 2:
输入: root = [5,3,6,2,4,null,7], key = 0
输出: [5,3,6,2,4,null,7]
解释: 二叉树不包含值为 0 的节点
示例 3:
输入: root = [], key = 0
输出: []
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if(root==null)
return null;
else if(key<root.val)
{
root.left=deleteNode( root.left, key);//左边找
return root;
}
else if(key>root.val)
{
root.right=deleteNode( root.right, key);//右边找
return root;
}
else
{
//key==root.val
if(root.left==null)
return root.right;
else if(root.right==null)
return root.left;
else
{//最复杂的情况,分步骤解决
TreeNode node=minrpiont(root.right);
node.right=delete(root.right);
node.left=root.left;
return node;
}
}
}
private TreeNode minrpiont(TreeNode head)//找到右边子树的最小节点,并返回该节点
{
if(head.left==null)
return head;
return minrpiont(head.left);
}
private TreeNode delete(TreeNode head)
{
if(head.left==null)
{
return head.right;//找到最小节点的右子树
}
head.left=delete(head.left);//并将上方的找到的右子树链接到最小节点的父母节点上方
return head;
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}