删除BST中的节点

时间:2017-12-25 14:43:13

标签: linked-list binary-search-tree

以下代码是website

我在这里遇到了部分代码的问题。 我对这一行有疑问:

root->left = deleteNode(root->left, key);

为什么我不能在这里简单地使用deleteNode(root->left, key);? 我想问一下这行中root->left的功能是什么!

/* Given a binary search tree and a key, this function deletes the key
   and returns the new root */
struct node* deleteNode(struct node* root, int key)
{
    // base case
    if (root == NULL) return root;

    // If the key to be deleted is smaller than the root's key,
    // then it lies in left subtree
    if (key < root->key)
        root->left = deleteNode(root->left, key);

    // If the key to be deleted is greater than the root's key,
    // then it lies in right subtree
    else if (key > root->key)
        root->right = deleteNode(root->right, key);

    // if key is same as root's key, then This is the node
    // to be deleted
    else
    {
        // node with only one child or no child
        if (root->left == NULL)
        {
            struct node *temp = root->right;
            free(root);
            return temp;
        }
        else if (root->right == NULL)
        {
            struct node *temp = root->left;
            free(root);
            return temp;
        }

        // node with two children: Get the inorder successor (smallest
        // in the right subtree)
        struct node* temp = minValueNode(root->right);

        // Copy the inorder successor's content to this node
        root->key = temp->key;

        // Delete the inorder successor
        root->right = deleteNode(root->right, temp->key);
    }
    return root;
}

1 个答案:

答案 0 :(得分:1)

首先,您需要注意该功能并非无效,因此您不能简单地使用deleteNode(root->left, key)

如果我理解正确,您想知道返回值是什么以及为什么将它放在左(或右)节点内。

如果你没有进入要删除的节点root->left = deleteNode(root->left, key);就像使用`deleteNode(root-&gt; left,key),即 - 向左走。

找到要删除的节点后,几乎没有选项:  1.如果你只有一个孩子或没有孩子的节点,你将节点值更新为这一个孩子。 因此,通过root->left = deleteNode(root->left, key);类型,您可以更新此值。

  1. 如果有两个儿子,你会找到顺序继承者(并且它是一片叶子)和&#34;交换&#34;之间有值而不是你删除叶子。 所以现在root->left = deleteNode(root->left, key);表示你将值更新为后继者并删除节点。
  2. 我希望它有用。