LeetCode450删除二叉搜索树中的节点

题目描述

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点,如果找到了,删除它。

解析

这题需要知道删除的三种情况以及一个小技巧。删除分无子树、单子树和双子树的情况,前两种比较简单,第三种需要找到删除节点的右边最小节点替代它,在删除右边最小节点转为上两种情况。然后是对于根节点,由于没有父节点,要么单独判断要么就可以加一个哨兵节点。

复制代码
public TreeNode deleteNode(TreeNode root, int key) {
    TreeNode dummy = new TreeNode(0);
    dummy.left = root;
    TreeNode parent = dummy, node = root;
    boolean isLeft = true;

    // 查找节点
    while (node != null && node.val != key) {
        parent = node;
        if (key < node.val) {
            node = node.left;
            isLeft = true;
        } else {
            node = node.right;
            isLeft = false;
        }
    }
    
    if (node == null) return dummy.left;  // 没找到直接返回

    // 删除找到的节点
    if (node.left != null && node.right != null) {  // 两个子节点
        TreeNode successor = node.right, successorParent = node;
        while (successor.left != null) {
            successorParent = successor;
            successor = successor.left;
        }
        node.val = successor.val;
        node = successor;
        parent = successorParent;
        isLeft = (successorParent.left == successor);
    }

    TreeNode replacement = (node.left != null) ? node.left : node.right;

    if (isLeft) {
        parent.left = replacement;
    } else {
        parent.right = replacement;
    }

    return dummy.left;
}
相关推荐
wuqingshun314159几秒前
蓝桥杯 切割
数据结构·c++·算法·职场和发展·蓝桥杯
艾妮艾妮3 分钟前
C语言常见3种排序
java·c语言·开发语言·c++·算法·c#·排序算法
百度Geek说4 分钟前
前沿多模态模型开发与应用实战3:DeepSeek-VL2多模态理解大模型算法解析与功能抢先体验
算法
java技术小馆4 分钟前
Zookeeper中的Zxid是如何设计的
java·分布式·zookeeper·云原生
小王努力学编程5 分钟前
动态规划学习——回文子串系列问题【C++】
c++·学习·算法·leetcode·动态规划
葵野寺14 分钟前
【多线程】synchronized锁升级和优化
java·开发语言·java-ee
SimonKing23 分钟前
因为不知道条件注解@Conditional,错失15K的Offer!
java·后端·架构
ZTLJQ24 分钟前
基于机器学习的三国时期诸葛亮北伐失败因素量化分析
人工智能·算法·机器学习
橘猫云计算机设计24 分钟前
基于springboot微信小程序的旅游攻略系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·微信小程序·毕业设计·旅游
落榜程序员25 分钟前
Java 基础-30-单例设计模式:懒汉式与饿汉式
java·开发语言