[バイナリ検索ツリー] leetcode450:バイナリ検索ツリーノードを削除(媒体)

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: 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