免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
トピック:
解決策:
あなたは、その後、削除するノードを見つけるために、バイナリ・ソートツリーをトラバースします判断该删除节点的左子树是否为空
。空でない場合は、左の部分木を見つけるトラバース该左子树的最右边节点
最大のポイントの左部分木のノード値は、その後、我々はなります、つまり、删除节点的右子树连接
左の部分木の右端のノード上で、最終的に我々削除されたノードに接続されています右子树的左子树的根节点
カバーするために需要删除的节点
。それが空の場合、我々は直接使用右子树的根节点
カバーします需要删除的节点
。
コードは以下の通りであります:
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;
}
};