450. 删除二叉搜索树中的节点
难度中等1037
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
示例 1:
输入:root = [5,3,6,2,4,null,7], key = 3 输出:[5,4,6,2,null,null,7] 解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。 一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。 另一个正确答案是 [5,2,6,null,4,null,7]。
示例 2:
输入: root = [5,3,6,2,4,null,7], key = 0 输出: [5,3,6,2,4,null,7] 解释: 二叉树不包含值为 0 的节点
示例 3:
输入: root = [], key = 0 输出: []
提示:
[0, 104]
.-105 <= Node.val <= 105
root
是合法的二叉搜索树-105 <= key <= 105
进阶: 要求算法时间复杂度为 O(h),h 为树的高度。
本题利用二叉搜索树的特性 都是根节点的值>左子树的所有节点,根节点的值<右子树的所有节点
class Solution {public TreeNode deleteNode(TreeNode root, int key) {if(root==null) return null;if(root.val==key) {if(root.left==null&&root.right==null) {//叶子结点直接把当前节点删除即可,也就是返回null给父节点接上return null;}else if(root.left==null&&root.right!=null) {//要删除当前节点,当前节点左为null,右不为null//那就把当前节点的右子树返回去给父节点接上,也就把当前节点删除了return root.right;}else if(root.left!=null&&root.right==null) {//要删除当前节点,当前节点右为null,左不为null//那就把当前节点的左子树返回去给父节点接上,也就把当前节点删除了return root.left;}else {//左右子树都不为null,要删除当前节点,那就需要找一个比当前节点大一点的//或者比当前节点小一点的数替代当前节点.帮其把左子树或者右子树保存下来TreeNode cur = root.right;//找到右子树的最左节点(比当前节点大一点)while(cur.left!=null){cur = cur.left;}//将当前节点的左子树接到cur的左子树上cur.left = root.left;//返回子树新头部return root.right;}}//去左子树找删除的结点,删除完毕后把删除好的头结点接在左孩子上if(root.val>key){root.left = deleteNode(root.left,key);}//去右子树找删除的结点,删除完毕后把删除好的头结点接在右孩子上if(root.val
class Solution {public TreeNode deleteNode(TreeNode root,int key) {if(root==null) return null;if(root.val==key){if(root.left==null&&root.right==null){return null;}else if(root.left==null){return root.right;}else if(root.right==null){return root.left;}}TreeNode cur = root;TreeNode parent = null;while (cur != null) {if(cur.val < key) {parent = cur;cur = cur.right;}else if(cur.val == key) {//这里开始删除!removeNode(root,parent,cur);return root;}else {parent = cur;cur = cur.left;} }return root;}private void removeNode(TreeNode root,TreeNode parent,TreeNode cur) {if(cur.left==null){if(cur==root) {root = cur.right;}else if(cur==parent.left) {parent.left = cur.right;}else{parent.right = cur.right;}}else if(cur.right==null){if(cur==root) {root = cur.left;}else if(cur==parent.left) {parent.left = cur.left;}else{parent.right = cur.left;}}else {TreeNode targetParent = cur;TreeNode target = cur.right;while(target.left!=null){targetParent = target;target = target.left;}cur.val = target.val;if(targetParent.left==target){targetParent.left = target.right;}else {targetParent.right = target.right;}}}
}