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

Leetcode 450. 删除二叉搜索树中的节点 [二叉搜索树]

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

Leetcode 450. 删除二叉搜索树中的节点 [二叉搜索树]

题目 思路

如果要删除节点的值大于当前根节点,则向右子树递归删除;如果要删除节点的值小于当前根节点,则向左子树递归删除;如果当前节点就是要删除的节点,则需要考虑当前根节点的值被哪个值所替换:

  1. 如果右子树不为空,则将右子树中最小的值赋给当前根节点;
  2. 如果右子树为空,但左子树不为空,则将左子树中最大的值赋给当前节点;
  3. 如果左右子树均为空,则将当前节点置为空即可
代码
class Solution {
public:
        TreeNode* deleteNode(TreeNode* root, int key) {
            if(root == nullptr) return root;
            else if(key > root->val) {
                root->right = deleteNode(root->right, key);
            } else if(key < root->val) {
                root->left = deleteNode(root->left, key);
            } else {
                if(root->right) {
                    if(root->right->left) {
                        auto t = root->right;
                        auto pre = t;
                        while(t->left) {
                            pre = t;
                            t = t->left;
                        }
                        root->val = t->val;
                        pre->left = t->right;
                        delete t;
                    } else {
                        root->val = root->right->val;
                        auto t = root->right;
                        root->right = root->right->right;
                        delete t;
                    }
                } else if(root->left) {
                    if(root->left->right) {
                        auto t = root->left;
                        auto pre = t;
                        while(t->right) {
                            pre = t;
                            t = t->right;
                        }
                        root->val = t->val;
                        pre->right = t->left;
                        delete t;
                    } else {
                        root->val = root->left->val;
                        auto t = root->left;
                        root->left = root->left->left;
                        delete t;
                    }
                }
                else {
                    return nullptr;
                }
            }
            return root;
        }
};
执行结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960407.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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