You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需递归和额外函数的BST节点删除实现及递归逻辑优化

方案1:无递归、无额外函数的BST删除实现

思路:通过迭代定位待删除节点及其父节点,再根据节点子节点数量分类处理,所有逻辑封装在单个函数内,无递归调用、无额外辅助函数。
完整实现代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        TreeNode *cur = root, *parent = nullptr;
        // 迭代查找待删除节点和父节点
        while (cur != nullptr && cur->val != key) {
            parent = cur;
            cur = cur->val < key ? cur->right : cur->left;
        }
        // 未找到目标节点直接返回
        if (cur == nullptr) return root;

        // 处理待删除节点只有0/1个子节点的情况
        if (cur->left == nullptr) {
            TreeNode* child = cur->right;
            if (parent == nullptr) root = child;
            else parent->left == cur ? parent->left = child : parent->right = child;
            delete cur;
        } else if (cur->right == nullptr) {
            TreeNode* child = cur->left;
            if (parent == nullptr) root = child;
            else parent->left == cur ? parent->left = child : parent->right = child;
            delete cur;
        } 
        // 处理待删除节点左右子节点都存在的情况
        else {
            TreeNode *minParent = cur, *minNode = cur->right;
            while (minNode->left != nullptr) {
                minParent = minNode;
                minNode = minNode->left;
            }
            cur->val = minNode->val;
            minParent->left == minNode ? minParent->left = minNode->right : minParent->right = minNode->right;
            delete minNode;
        }
        return root;
    }
};

方案2:移除while循环的纯递归实现(无额外自定义函数)

思路:通过给原deleteNode函数增加默认参数的方式,复用递归框架实现原while循环的「查找右子树最小节点并挂载左子树」逻辑,不需要新增任何自定义辅助函数,完全符合要求。
修改后的完整代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    // 新增默认参数insertLeft:当不为空时,递归将该子树挂载到当前子树的最左节点
    TreeNode* deleteNode(TreeNode* r, int k, TreeNode* insertLeft = nullptr) {
        // 挂载逻辑分支
        if (insertLeft != nullptr) {
            if (r == nullptr) return insertLeft;
            r->left = deleteNode(r->left, 0, insertLeft);
            return r;
        }
        // 原有删除逻辑
        if(r == nullptr)
            return nullptr;
        if(r->val < k)
        {
            r->right = deleteNode(r->right, k);
            return r;
        }
        else if(r->val > k)
        {
            r->left = deleteNode(r->left, k);
            return r;
        }
        if(r->left == nullptr)
            return r->right;
        if(r->right == nullptr)
            return r->left;        
        // 原while逻辑替换为递归调用,将左子树挂载到右子树最左节点
        r->right = deleteNode(r->right, 0, r->left);
        return r->right;
    }
};

代码说明:外部调用方式和原有实现完全一致,不需要传第三个参数,默认值为空时走正常删除逻辑;需要挂载左子树时传入第三个参数,自动递归查找最左节点完成挂载,完全替换了原来的while循环逻辑。


内容的提问来源于stack exchange,提问作者Bhaumik_Tandan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:09:03