以下代码是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;
}
答案 0 :(得分:1)
首先,您需要注意该功能并非无效,因此您不能简单地使用deleteNode(root->left, key)
。
如果我理解正确,您想知道返回值是什么以及为什么将它放在左(或右)节点内。
如果你没有进入要删除的节点root->left = deleteNode(root->left, key);
就像使用`deleteNode(root-&gt; left,key),即 - 向左走。
找到要删除的节点后,几乎没有选项:
1.如果你只有一个孩子或没有孩子的节点,你将节点值更新为这一个孩子。
因此,通过root->left = deleteNode(root->left, key);
类型,您可以更新此值。
root->left = deleteNode(root->left, key);
表示你将值更新为后继者并删除节点。我希望它有用。