栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

二叉排序树删除节点

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

二叉排序树删除节点

二叉排序树删除节点C++实现

对应LeetCode
450. 删除二叉搜索树中的节点
思路:找到这个节点,并标记其父节点,根据其在树中的位置做相应的处理,以保证二叉排序树的性质,因为根节点没有父节点,所以需要特殊处理。

TreeNode* deleteNode(TreeNode* root, int key) {
        TreeNode* parent = root;
        TreeNode* cur = root;
        while(cur) {//找到这个节点,并标记它的父节点
            if (cur->val > key) {
                parent = cur;
                cur = cur->left;
            } else if (cur->val < key) {
                parent = cur;
                cur = cur->right;
            } else {
                break;
            }
        }
        if (cur != nullptr) {//节点存在
            if (cur->left == nullptr) {//左子树为空
                if (cur->right == nullptr && cur == root) {//为根节点,且左右子树为空
                    delete cur;
                    return nullptr;
                } else if(cur == parent) {//为根节点,且右子树不空
                    cur = cur->right;
                    delete parent;
                    return cur;
                } 
                else {//不是根节点
                    parent->left == cur ? parent->left = cur->right : parent->right = cur->right;
                    delete cur;
                    cur = nullptr;
                }
            } else if(cur->right == nullptr) {//右子树为空
                if (parent == cur) {//为根节点,且左子树不空
                    cur = cur->left;
                    delete parent;
                    return cur;
                }else{//不是根节点
                    parent->left == cur ? parent->left = cur->left : parent->right = cur->left;
                    delete cur;
                    cur = nullptr;
                }
                
            } else {//左右都不为空,找到其右子树最小节点/左子树最大节点代替此节点,这里用前者
                TreeNode* rightMin = cur->right;
                parent = cur->right;
                while(rightMin->left != nullptr) {
                    parent = rightMin;
                    rightMin = rightMin->left;
                }
                cur->val = rightMin->val;
                if (rightMin == parent) {
                    cur->right = rightMin->right;
                } else {
                    parent->left = rightMin->right;
                }
                delete rightMin;
                rightMin = nullptr;
            }
        }
        return root;
        
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/947539.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号