当前位置:首页 > 力扣 > 力扣450题:删除二叉搜索树中的节点 - 递归解法详解

力扣450题:删除二叉搜索树中的节点 - 递归解法详解

5个月前 (06-06)

力扣450题:删除二叉搜索树中的节点 - 递归解法详解  BST操作 递归算法 数据结构实现 算法面试题解 二叉搜索树维护 第1张

内容简介

本文详细解析了力扣450题"删除二叉搜索树中的节点"的递归解法。通过递归遍历二叉搜索并根据不同情况处理节点删除操作,实现了BST节点的精确删除。文章包含完整注释代码、算法思路讲解和复杂度分析,帮助读者掌握二叉搜索树操作的核心技巧。


算法思路

一、查找节点‌:根据BST性质递归查找目标节点

‌二、删除情况处理‌:

    1.无子节点:直接删除

    2.只有左/右子树:用子树替代当前节点

    3.有两个子节点:用右子树最小节点替代当前节点

‌三、递归调整‌:递归处理子树删除后的结构调整


代码实现(带详细注释)

class Solution {
public:
    // 查找子树最小节点(最左节点)
    TreeNode* minnode(TreeNode* root) {
        if(!root || !root->left) return root;  // 终止条件:无左子节点
        return minnode(root->left);            // 递归查找左子树
    }
    
    // 删除BST节点的递归函数
    TreeNode* deleteNode(TreeNode* root, int key) {
        if(!root) return nullptr;  // 空树直接返回
        
        // 查找目标节点
        if(key < root->val) {
            root->left = deleteNode(root->left, key);  // 在左子树查找
        } 
        else if(key > root->val) {
            root->right = deleteNode(root->right, key); // 在右子树查找
        } 
        else {  // 找到目标节点
            // 情况1:无子节点或仅有一个子节点
            if(!root->right) return root->left;  // 只有左子树
            if(!root->left) return root->right;  // 只有右子树
            
            // 情况2:有两个子节点
            TreeNode* minRight = minnode(root->right);  // 找到右子树最小节点
            root->val = minRight->val;  // 用最小节点值替换当前节点
            root->right = deleteNode(root->right, minRight->val);  // 删除右子树中的最小节点
        }
        return root;  // 返回调整后的子树根节点
    }
};

复杂度分析

‌时间复杂度‌:O(h),h为树的高度

最坏情况(树退化为链表):O(n)

平衡BST情况:O(log n)

‌空间复杂度‌:O(h),递归空间


优化方向

迭代实现‌:可以改用栈或指针操作消除递归

‌平衡优化‌:删除后检查并维护BST平衡性

‌错误处理‌:添加对无效输入的检查


总结

BST节点删除是二叉树操作的重要问题,通过递归处理不同删除情况,可以高效维护BST的结构特性。理解这种解法有助于掌握BST的核心操作和递归算法的应用技巧。


原创内容 转载请注明出处

分享给朋友:

相关文章

【蓝桥杯2015省赛解析】生命之树:树形DP解题全攻略(洛谷P8625代码详解)

【蓝桥杯2015省赛解析】生命之树:树形DP解题全攻略(洛谷P8625代码详解)

一、题目解读    “生命之树”是一道经典的树形结构问题,要求计算一棵带权树中,以某个节点为根的最大子树权值和。题目输入为n个节点及边信息,每个节点有权值wi,...

手搓二叉树构建类代码详解:从入门到实践(适合新手小白)

一、简介和应用二叉树是数据结构中常见的一种树形结构,每个节点最多有两个子节点(左子节点和右子节点)。它广泛应用于算法设计、数据存储与搜索(如二叉搜索树)、表达式解析等领域。本文将通过手写的C++代码,...

洛谷P2789题解:递归算法与避免重复计算的技巧

洛谷P2789题解:递归算法与避免重复计算的技巧

一、题目解读洛谷P2789题要求计算n条直线在平面上两两相交产生的交点总数。题目强调交点不重复,需考虑平行线情况。关键点在于如何高效枚举所有可能的交点组合,并排除重复结果。二、解题思路采用递归算法,核...

牛客3747题解析:二叉树序列化与反序列化(C++实现)

牛客3747题解析:二叉树序列化与反序列化(C++实现)

一、题目解读牛客3747题要求实现二叉树的序列化与反序列化功能。序列化即将二叉树转化为字符串,反序列化则将字符串还原为二叉树结构。题目核心在于设计高效的遍历与节点表示方法,需考虑空节点的处理,确保序列...

(2017蓝桥杯省A)洛谷P8650题解:递归解析正则表达式并求解最大长度

(2017蓝桥杯省A)洛谷P8650题解:递归解析正则表达式并求解最大长度

一、题目解读洛谷P8650题要求解析由‘x’、‘|’和括号组成的表达式,计算并输出其最大长度。题目核心在于处理嵌套括号与‘|’分隔的项。二、解题思路使用递归策略:1. 解析因子:识别单个‘x’或括号表...

【NOIP1998】幂次方解题:递归与位运算的巧妙结合(附代码解析)

【NOIP1998】幂次方解题:递归与位运算的巧妙结合(附代码解析)

一、题目解读1998年NOIP普及组题目“幂次方”(对应洛谷P1010)要求将给定整数N转换为2的幂次方和的表达式,例如N=5应输出“2+2(2)”。题目考察对数字分解、递归算法及位运算的理解,需找到...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。