[二叉搜索树]leetcode450:删除二叉搜索树中的节点(medium)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43152052/article/details/100168561

题目:
在这里插入图片描述

题解:
遍历二叉排序树,找到需要删除的节点,然后判断该删除节点的左子树是否为空。若不为空,则遍历左子树找到该左子树的最右边节点,也就是该左子树中的节点值最大点,然后我们将删除节点的右子树连接到该左子树的最右边节点上,最后我们用已连接上删除节点的右子树的左子树的根节点来覆盖需要删除的节点。若为空,那么我们直接用右子树的根节点来覆盖需要删除的节点

代码如下:

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if(root==nullptr)return nullptr;
        if (root->val == key) //找到需要删除的节点
        {
            if (root->left)
            {//遍历删除节点的左子树,找到该左子树的最右边节点,也就是整个左子树中的最大值,然后将删除的节点的右子树连接到最右边节点上,返回左子树
                TreeNode* node = root->left;
                while (node->right) node = node->right;
                node->right = root->right;
                return root->left;
            }
            //左子树为空,直接将右子树节点替换到删除节点上
            return root->right;
        }
        if (root->val > key)
            root->left = deleteNode(root->left, key);
        else
            root->right = deleteNode(root->right, key);
        return root;
    }
};

另一种解法:
与上一题思路一样,只是将删除节点的左子树连接到删除节点的右子树的最左边节点了,也就是右子树的最小节点值。(左子树的根节点为左子树的最大节点值但是还是小于右子树的最小节点值)。

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root,int key)
    {
        if(root==nullptr)return nullptr;
        if(root->val==key)
        {
            if(root->right)
            {//遍历删除节点的右子树,找到该右子树的最左边节点,也就是整个右子树中的最小值,然后将删除节点的左子树连接到最左边节点上,返回右子树
             //因为删除节点左子树的所有节点都小于删除节点,而删除节点的右子树的所有节点都大于删除节点,所以右子树中的最小节点值也会大于左子树中的最大节点值
             	TreeNode* node=root->right;
                while(node->left)node=node->left;
                node->left=root->left;
                return root->right;
            }
            //若右子树为空,直接将删除节点的左子树
            return root->left;
        }
        if (root->val > key)
            root->left = deleteNode(root->left, key);
        else
            root->right = deleteNode(root->right, key);
        return root;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/100168561